programing

필요한 하위 구문 분석기를 사용한 인수 구문 분석

linuxpc 2023. 5. 21. 11:00
반응형

필요한 하위 구문 분석기를 사용한 인수 구문 분석

파이썬 3.4를 사용하고 있습니다.argparse하위 파서와 함께, 그리고 저는 Python 2.x에서 (하위 파서/하위 프로그램을 나타내는) 위치 인수를 제공하지 않으면 유용한 오류 메시지가 표시되는 것과 유사한 동작을 하고 싶습니다.예를 들어, 와python2다음 오류 메시지가 표시됩니다.

$ python2 subparser_test.py    
usage: subparser_test.py [-h] {foo} ...
subparser_test.py: error: too few arguments

내가 설정하는 중입니다.required그러나 https://stackoverflow.com/a/22994500/3061818, 에서 제안한 속성은 Python 3.4.0에서 오류를 제공합니다.TypeError: sequence item 0: expected str instance, NoneType found전체 추적:

$ python3 subparser_test.py    
Traceback (most recent call last):
  File "subparser_test.py", line 17, in <module>
    args = parser.parse_args()
  File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1717, in parse_args
    args, argv = self.parse_known_args(args, namespace)
  File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1749, in parse_known_args
    namespace, args = self._parse_known_args(args, namespace)
  File "/usr/local/Cellar/python3/3.4.0/Frameworks/Python.framework/Versions/3.4/lib/python3.4/argparse.py", line 1984, in _parse_known_args
    ', '.join(required_actions))
TypeError: sequence item 0: expected str instance, NoneType found

이것은 나의 프로그램입니다.subparser_test.pyhttps://docs.python.org/3.2/library/argparse.html#sub-commands 에서 수정됨:

import argparse

# sub-command functions
def foo(args):
    print('"foo()" called')

# create the top-level parser
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
subparsers.required = True

# create the parser for the "foo" command
parser_foo = subparsers.add_parser('foo')
parser_foo.set_defaults(func=foo)

args = parser.parse_args()
args.func(args)

관련 질문:왜 이 argparse 코드는 Python 2와 3 사이에서 다르게 작동합니까?

당신은 주어야 합니다.subparsers a dest.

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='cmd')
subparsers.required = True

이제:

1909:~/mypy$ argdev/python3 stack23349349.py
usage: stack23349349.py [-h] {foo} ...
stack23349349.py: error: the following arguments are required: cmd

이 '인수 누락' 오류 메시지를 표시하려면 코드에서 해당 인수에 이름을 지정해야 합니다.위치 인수(하위 구문 분석 등)의 경우 해당 이름이 (기본적으로) 'dest'입니다.링크하신 SO 답변에 이에 대한 (단조) 메모가 있습니다.

에 대한 몇 안 되는 '패치' 중 하나.argparse마지막 Python 릴리스에서는 '필수' 인수를 테스트하는 방법이 변경되었습니다.안타깝게도 하위 파서와 관련하여 이 버그가 발생했습니다.이 문제는 다음 릴리스에서 해결해야 합니다(더 빠르지 않은 경우).

갱신하다

Py2에서 선택적인 하위 파서 동작을 원한다면, 에서 설명한 것처럼 2단계 파서를 사용하는 것이 가장 좋은 옵션인 것 같습니다.

Argparse Module with Python 2.7을 사용하여 기본 하위 파서를 설정하는 방법

관련 버그/문제에 최근 몇 가지 활동이 있습니다.

https://bugs.python.org/issue9253

갱신하다

에 대한 수정 작업이 진행 중입니다. https://github.com/python/cpython/pull/3027

앞에서 언급한 해결 방법은 더 이상 필요하지 않습니다.add_mutually_exclusive_group()메서드는 필수 인수도 허용합니다.

이는 상호 배타적 인수 중 하나 이상이 필요함을 나타냅니다.

parser = argparse.ArgumentParser(prog='PROG')
group = parser.add_mutually_exclusive_group(required=True)

group.add_argument('--foo', action='store_true')
group.add_argument('--bar', action='store_false')

> parser.parse_args([])
> usage: PROG [-h] (--foo | --bar)
> PROG: error: one of the arguments --foo --bar is required

argsparse 문서에서 가져온 것: https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser.add_mutually_exclusive_group

언급URL : https://stackoverflow.com/questions/23349349/argparse-with-required-subparser

반응형