2017-11-18 10 views
1

우리는 이미 인수 그룹을 정의했다고 가정 해 봅시다. 이제 추가 인수를 추가하기 위해 그 중 하나에 액세스하려고합니다. 그래서 argparse에서 이것을하는 가장 좋은 방법은 무엇입니까? 이제 내 접근 방식은 다음과 같습니다 :argparse에서 이미 정의 된 인수 그룹에 액세스하는 방법은 무엇입니까?

def get_parser(self, ...): 
    parser = ... 

    matching_groups = (g for g in parser._action_groups 
         if g.title == 'group name') 
    group = next(matching_groups, None) or parser 
    group.add_argument('-s', '--some-new-argument', ...) 
    return parser 

'보호 된'회원에 직접 액세스하지 못하게하는 더 세련된 방법이 있습니까?

+0

아니요, 이러한 그룹의 '보호되지 않은'목록은 없습니다. 파이썬에서 이와 같은 속성 이름을 사용한다는 것은 "임시 사용자가 필요하지는 않다"는 것을 의미하지만, 지식이있는 사용자는이를 사용하는 것이 금지되어 있지 않습니다. 'argparse.py'에서'_action_groups'는'_add_container_actions'에서'parents' 메카니즘과 함께 사용되며'help formatter'를 설정할 때 사용됩니다. 목록은 구문 분석에 사용되지 않습니다. – hpaulj

+0

'_action_groups'의 다른 용도 : https://stackoverflow.com/questions/39047075/reorder-python-argparse-argument-groups, https://stackoverflow.com/questions/12268602/sort-argparse-help- 알파벳순. – hpaulj

답변

0

add_argument_group을 호출하면 그룹이 반환됩니다. 나중에 그룹에 액세스해야하는 경우 해당 반환 값을 무언가에 할당하십시오.

그룹이 많은 경우 그룹에 그룹 제목을 사용할 수 있습니다. 파서 인스턴스에는 __dict__이 있습니다. 원하는 경우 파서에 속성으로 직접 그룹이나 다른 항목을 저장할 수 있습니다.

>>> parser = argparse.ArgumentParser() 
>>> parser.groups = {} 
>>> group = parser.groups['my_group'] = parser.add_argument_group('my_group') 
>>> parser.groups['my_group'] is group 
True 
+0

그룹을 반환한다는 것을 알고 있지만 불행히도 '시작 지점'으로 사용하고있는 라이브러리를 수정할 수는 없습니다. 그래서 유일한 방법은 이미 구현 된 코드를 '확장'하는 것입니다. – machin