我正在使用Python 3.4,正在尝试argparse与子解析器一起使用,并且我希望具有与Python 2.x中类似的行为,如果我不提供位置参数(以指示子解析器/子程序)我会收到一条有用的错误消息。即,随着python2我将得到以下错误消息:
argparse
python2
$ python2 subparser_test.py usage: subparser_test.py [-h] {foo} ... subparser_test.py: error: too few arguments
我正在required按照http://codingdict.com/questions/172394建议设置属性,但是这给了我Python 3.4.0错误: TypeError: sequence item 0: expected str instance, NoneType found-完全追溯:
required
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.py-改编自https://docs.python.org/3.2/library/argparse.html#sub- commands:
subparser_test.py
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)
您需要给subparsers一个dest。
subparsers
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
为了发出此“缺少参数”错误消息,代码需要给该参数命名。对于位置自变量(如子表达式),该名称(默认情况下)为“目标”。在您链接的SO答案中有一个(次要)说明。
argparse在上一个Python版本中,为数不多的“补丁”之一改变了它测试“必需”参数的方式。不幸的是,它引入了有关次解析器的错误。此问题需要在下一个版本中解决(如果不能尽快)。
如果您希望在Py2中具有此可选的子解析器行为,则最好的选择是使用两阶段解析器
相关的错误/问题中有一些近期活动
https://bugs.python.org/issue9253
正在对此进行修复:https : //github.com/python/cpython/pull/3027