2017-04-04 12 views
-1

제 문제는 dict (argparse)입니다. flag에 속성이 하나만있는 경우 파서는 string을 반환하고 그렇지 않으면 list를 반환합니다. 기본적으로 파서를 만들고 있는데, 이는 입력 인수로 명령을 생성합니다. 예 :문자열 또는 목록 변수에 문자열을 추가하십시오.

kwargs = {-name: "MyName", tags: ["tag_1", "tag_2", "tag_3"] } 

필요한 출력 : 내가 어떤 것을 할 관리,하지만이 최적의 방법이라고 생각하지 않습니다

"--name Myname --tags tag_1 tag_2 tag3" 

:/

for k, v in kwargs.iteritems(): 
    if v is None: 
     continue 
    elif not isinstance(v, basestring): 
     print (v) 
     command = command+' {} '.format(k) + ' '.join(v) 
    else: 
     print (v) 
     command = command+' {} {}'.format(k, v) 

는 또한 나는이 방법을 사용 argparse, feth 값 vars(argparse.parse_args()) (이 부분은이 질문의 일부는 아니지만 누군가가 알고있을 수도 있음). '-'그 방법이 최고의 실종 유지 표지판을하지만, 내가 그들을 가지고 싶습니다 ... 많은 :) 예 :

--tag tag_1 tag_2 tag_3 

가 변환됩니다 :

[tag: tag_1, tag_2, tag3] 
+0

'.add_argument()'의'dest' 키워드 인수를보십시오. – zondo

답변

0

확실하지 나는 경우 100 % 질문을 이해하십시오. 다음과 같이,

kwargs = {"--name" : "MyName", "--tags" : ["tag_1", "tag_2", "tag_3"] } 

그 방법을 DICT를 사용할 수없는 이유 하지만 당신의 명령을 원하는 출력을하기 위해

>>> command 
'your_command --name MyName --tags tag_1 tag_2 tag_3' 
+0

왜냐하면 나는 argparse를 사용하기 때문에 파싱의 방법이 다르다. 필자의 지식으로는 구문 분석 방식을 바꿀 수만은 없습니다. https://docs.python.org/3/library/argparse.html – user2678074

0

이 될 것입니다, 당신은 이런 식으로 뭔가를 시도 할 수 있습니다 :

kwargs = {'name': "MyName", 'tags': ["tag_1", "tag_2", "tag_3"] } 
final = "--{0} {1} --{2} {3}".format(list(kwargs.keys())[0], list(kwargs.values())[0], list(kwargs.keys())[1], " ".join(list(kwargs.values())[1])) 
print(final) 

출력 :

'--name MyName --tags tag_1 tag_2 tag_3' 
+0

입력 내용이 약간 다를 수 있습니다. 나는 그것을 위해 일반적인 것을 필요로한다. 즉, 'n'개의 목록 요소와 'm'개의 요소 만있을 수 있습니다. 사전이기 때문에 순서가 다를 수 있습니다. – user2678074

1

이 기능은 당신이 원하는 무엇을 생산 하는가 :

def foo(adict): 
    alist = [] 
    for k,v in adict.items(): 
     k = '--'+k 
     if isinstance(v,list): 
      v = ' '.join([str(i) for i in v]) 
     else: 
      v = str(v) 
     alist.append('{} {}'.format(k,v)) 
    return ' '.join(alist) 

키가 사소한입니다 --에 추가. 단일 문자 키에 단지 - 만 추가되도록 수정할 수 있다고 가정합니다. 나머지는 목록 (및 비 문자열 값)이 올바르게 형식화되었는지 확인합니다.

서식의 모든 세부 조정을 수행하는 것은 argparse 또는 그 출력을 직접 조정하는 것보다 훨씬 쉽습니다.

In [38]: args = argparse.Namespace(name="MyName", tags=['tag1','tag2'], other=12) 
Out[39]: Namespace(name='MyName', other=12, tags=['tag1', 'tag2']) 
In [41]: vars(args) 
Out[41]: {'name': 'MyName', 'other': 12, 'tags': ['tag1', 'tag2']} 
In [42]: foo(vars(args)) 
Out[42]: '--tags tag1 tag2 --name MyName --other 12' 
+0

글쎄, 내가 ('-'기호를 추가하는 것을 제외하고) 거의 같은 방법이다. 더 원시적 인 사전 형식 인 argparse를 얻는 방법을 알고 있거나 문자열과 목록 매개 변수를 구별하지 않고 (예 : 원시 문자열 대신에 argparse에서 하나의 요소 목록을 갖는 것 등) 구별 할 수있는 방법을 알고 있다면 더 궁금합니다. 스크립트에 대한 입력 값을 처리하기위한 대안 (처음부터 자신의 클래스를 생성하지 않음). 그래도 정말 당신의 도움을 주셔서 감사합니다, 그것은 정확히 내가 뭘 찾고 있어요. – user2678074