2017-11-15 11 views
1

사용자가 위치 인수 또는 선택적 인수와 함께 'argparse'에 필수 인수를 전달할 수있게하려고합니다.Python argparse - 필수 인수 - 위치 또는 선택적 인수

즉, 모두 다음 형식은 유효하다 : 나는

Argparse optional positional arguments?을 본 적이 그러나 제안이 모두 양식을 선택하게

my_prog arg 
my_prog -m arg 

. 그 중 중 하나가 일 것입니다.

물론 적어도 하나가 설정되었다는 것을 파싱 한 후 수동 검사를 추가 할 수 있습니다. 그러나 나는 더 나은 해결책이 있어야한다는 직감을 가지고 있습니다.

mutually exclusive group 메커니즘은 required 매개 변수를 취할 수

답변

2

(그리고 심지어 내 매뉴얼 접근 방식의 '도움'섹션 둘 다 선택 사항으로 표시). 또한 하나의 ? 위치와 함께 옵션 (플래그가 지정된 인수)과 함께 작동합니다. (하나 이상의 '?'위치는 의미가 없습니다).

help 디스플레이에는 두 개의 기본 그룹 인 positonaloptional이 있습니다. 따라서 optional (플래그가 지정된)이 required으로 설정된 경우에도 기본적으로 optional 그룹에 표시됩니다. usage 행은 인수가 필요한지 아닌지에 대한 더 나은 지침입니다. 도움말 섹션의 그룹 레이블이 마음에 들지 않으면 고유 한 인수 그룹을 정의하십시오.

In [146]: import argparse 
In [147]: parser = argparse.ArgumentParser() 
In [148]: gp = parser.add_mutually_exclusive_group(required=True) 
In [149]: gp.add_argument('pos', nargs='?', default='foo'); 
In [150]: gp.add_argument('-f','--foo', default='bar'); 

In [151]: parser.parse_args('arg'.split()) 
Out[151]: Namespace(foo='bar', pos='arg') 

In [152]: parser.parse_args('-f arg'.split()) 
Out[152]: Namespace(foo='arg', pos='foo') 

In [153]: parser.parse_args('arg -f arg'.split()) 
usage: ipython3 [-h] [-f FOO] [pos] 
ipython3: error: argument -f/--foo: not allowed with argument pos 

In [154]: parser.parse_args(''.split()) 
usage: ipython3 [-h] [-f FOO] [pos] 
ipython3: error: one of the arguments pos -f/--foo is required 


In [155]: parser.parse_args('-h'.split()) 
usage: ipython3 [-h] [-f FOO] [pos] 

positional arguments: 
    pos 

optional arguments: 
    -h, --help   show this help message and exit 
    -f FOO, --foo FOO 

아차는 사용이 상호 배타 그룹의 -fpos 표시되지 않습니다. 때로는 usage 서식이 약합니다.

In [165]: parser = argparse.ArgumentParser() 
In [166]: gp = parser.add_argument_group('Mutually exclusive') 
In [167]: gpm = gp.add_mutually_exclusive_group(required=True) 
In [168]: gpm.add_argument('-f','--foo', default='bar'); 
In [169]: gpm.add_argument('pos', nargs='?', default='foo'); 
In [170]: 
In [170]: parser.parse_args('-h'.split()) 
usage: ipython3 [-h] (-f FOO | pos) 

optional arguments: 
    -h, --help   show this help message and exit 

Mutually exclusive: 
    -f FOO, --foo FOO 
    pos 

이 일반 규칙 argument_groups 및 mutually_exclusive_groups에 한 가지 예외가있다 : 인수가 정의되는 순서를 전환

사용자 정의 인수 그룹으로 더 나은 사용

In [156]: parser = argparse.ArgumentParser() 
In [157]: gp = parser.add_mutually_exclusive_group(required=True) 
In [158]: gp.add_argument('-f','--foo', default='bar'); 
In [159]: gp.add_argument('pos', nargs='?', default='foo'); 
In [160]: 
In [160]: parser.parse_args('-h'.split()) 
usage: ipython3 [-h] (-f FOO | pos) 

positional arguments: 
    pos 

optional arguments: 
    -h, --help   show this help message and exit 
    -f FOO, --foo FOO 

을 제공합니다 중첩을 위해 설계되지 않았습니다.

는 M-X-그룹이 필요하지 않은

, 사용은 []

usage: ipython3 [-h] [-f FOO | pos] 
+0

그레이트 사용할 수 있습니다. 단 한가지주의 할 점 :이 그룹 정의는 다른 모든 정규 인수 뒤에 와야합니다. 그렇지 않으면 도움말에 멋진'(-f FOO | pos)'가 표시되지 않습니다 – Zvika

+0

예, 2 가지가'usage'에 영향을줍니다. 옵션은 옵션 뒤에 표시되며 그룹은 인수가 해당 순서와 일치하는 경우에만 나타납니다. 취성을 교정하려면 사용 포맷터를 대대적으로 다시 작성해야합니다. – hpaulj