argparse를 사용하여 두 개의 인수 중 하나가 필요합니다.


183

주어진:

import argparse

pa = argparse.ArgumentParser()
pa.add_argument('--foo')
pa.add_argument('--bar')

print pa.parse_args('--foo 1'.split())

내가 어떻게 할

  • "foo는 바"적어도 하나 만들 필수 : --foo x, --bar y--foo x --bar y괜찮
  • "foo는 바"의 대부분을 하나 만들 필수 : --foo x--bar y괜찮, --foo x --bar y아니다

답변:


297

나는 당신이 상호 배제 와 같은 것을 찾고 있다고 생각합니다 (적어도 질문의 두 번째 부분은).

이런 식으로 foo 또는 bar 만 허용되며 둘 다 허용되지는 않습니다.

    import argparse

    parser = argparse.ArgumentParser()
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('--foo',action=.....)
    group.add_argument('--bar',action=.....)
    args = parser.parse_args()

BTW는 방금 같은 종류의 문제를 언급하는 또 다른 질문 을 발견 했습니다.

도움이 되었기를 바랍니다


1
나는 그것이 너무 쉽다고 생각하지 않았을 것이다! Python 3.6을 사랑하십시오!
bjd2385

기독교 위트는 누구이며 그의 대답은 어디에 있습니까?
ijoseph

3
안녕하세요 @ijoseph,이 답변은 지금까지 낡았습니다. 답이 무엇인지 더 잘 모르겠습니다. 아마 지금까지 제거되었을 것입니다. 그 죄송합니다!
jlengrand

1
@ jlengrand 당신의 대답은 실제로 질문에 제안 된 두 가지 조건을 실제로 해결한다는 것을 깨달은 후에도 여전히 효과가있었습니다 ( XOR, 기본적으로). 내 초기 관심사는 두 가지 조건 중 하나만 해결했다는 것입니다.
ijoseph

피드백 감사드립니다. 나는 그것이 실제로 모든 것을 해결하고 있다는 생각을 가지고 있었지만 더 이상 확신하지 못했습니다 : D. 그에 따라 답변을 편집하겠습니다!
jlengrand

39

모듈에서 제공하지 않는 검사가 필요한 경우 언제든지 수동으로 수행 할 수 있습니다.

pa = argparse.ArgumentParser()
...
args = pa.parse_args()

if args.foo is None and args.bar is None:
   pa.error("at least one of --foo and --bar required")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.