복붙노트

[PYTHON] 파이썬 argparse - 선택적 인수이거나 아니면 둘 다 아니다.

PYTHON

파이썬 argparse - 선택적 인수이거나 아니면 둘 다 아니다.

기본 이름과 암호를 사용하는 프로그램이 있습니다. 나는 argparse를 사용하여 사용자가 명령 행 옵션을 지정할 수있게하고, 사용자가 프로그램에 다른 이름과 암호를 제공 할 수있게하고 싶다. 그래서 나는 다음과 같은 것을 가지고있다.

parser.add_argument(
    '-n',
    '--name',
    help='the login name that you wish the program to use'
    )

parser.add_argument(
    '-p',
    '--password',
    help='the password to log in with.'
    )

그러나 이름이나 암호 만 지정하는 것은 의미가 없지만 어느 것도 지정하지 않는 것이 좋습니다. 나는 argparse가 두 개의 인수가 상호 배타적이라는 것을 지정할 수있는 능력을 가지고 있다는 것을 알아 차렸다. 그러나 내가 가진 것은 함께 나타나야 만하는 두 가지 주장입니다. 어떻게 이런 행동을합니까? (문서에서 언급 한 "인수 그룹"을 발견했지만 내 문제를 해결하지 못하는 것 같습니다. http://docs.python.org/2/library/argparse.html#argument-groups)

해결법

  1. ==============================

    1.이 문제를 해결하는 가장 좋은 방법은 반환 된 네임 스페이스를 사후 처리하는 것입니다. argparse가 이것을 지원하지 않는 이유는 인수 1을 한 번에 구문 분석하기 때문입니다. argparse가 이미 무언가가 파싱 되었는지를 확인하는 것이 쉽지만 (상호 배타적 인 논쟁이 작동하는 이유 인), 미래에 파싱 될지를보기는 쉽지 않습니다.

    이 문제를 해결하는 가장 좋은 방법은 반환 된 네임 스페이스를 사후 처리하는 것입니다. argparse가 이것을 지원하지 않는 이유는 인수 1을 한 번에 구문 분석하기 때문입니다. argparse가 이미 무언가가 파싱 되었는지를 확인하는 것이 쉽지만 (상호 배타적 인 논쟁이 작동하는 이유 인), 미래에 파싱 될지를보기는 쉽지 않습니다.

    간단한:

    parser.add_argument('-n','--name',...,default=None)
    parser.add_argument('-p','--password',...,default=None)
    ns = parser.parse_args()
    
    if len([x for x in (ns.name,ns.password) if x is not None]) == 1:
       parser.error('--name and --password must be given together')
    
    name = ns.name if ns.name is not None else "default_name"
    password = ns.password if ns.password is not None else "default_password"
    

    그것은 충분할 것 같습니다.

  2. ==============================

    2.나는 이것이 2 년 이상 늦었다는 것을 알고있다. 그러나 나는 그것을 할 수있는 간결하고 멋진 방법을 발견했다.

    나는 이것이 2 년 이상 늦었다는 것을 알고있다. 그러나 나는 그것을 할 수있는 간결하고 멋진 방법을 발견했다.

    if bool(ns.username) ^ bool(ns.password):
        parser.error('--username and --password must be given together')
    

    ^는 파이썬에서 XOR 연산자입니다. 명령 줄에 주어진 두 인수를 모두 요구하려면 XOR 테스트가 필수적입니다.

  3. ==============================

    3.아마 내가 어떻게 할 수 있겠는가. 변경할 옵션이있는 기존 기본값이 있으므로 기본값을 정의하지만 인수 기본값으로 사용하지 마십시오.

    아마 내가 어떻게 할 수 있겠는가. 변경할 옵션이있는 기존 기본값이 있으므로 기본값을 정의하지만 인수 기본값으로 사용하지 마십시오.

    default_name = "x"
    default_pass = "y"
    parser.add_argument(
        '-n',
        '--name',
        default=None,
        help='the login name that you wish the program to use'
        )
    
    parser.add_argument(
        '-p',
        '--password',
        default=None,
        help='the password to log in with.'
        )
    args = parser.parse_args()
    if all(i is not None for i in [args.name, args.password]):
        name = args.name
        passwd = args.password
    elif any(i is not None for i in [args.name, args.password]):
        parser.error("Both Name and Password are Required!")
    else:
        name = default_name
        passwd = default_pass
    
  4. from https://stackoverflow.com/questions/14350343/python-argparse-either-both-optional-arguments-or-else-neither-one by cc-by-sa and MIT license