我使用的是Python3.4,我试图将argparse
与子parers一起使用,我希望有一个类似于Python2.x中的行为,如果我不提供位置参数(指示子parser/子程序),我将得到一个有用的错误消息。一、 例如,使用python2
我将得到以下错误消息:
$ python2 subparser_test.py
usage: subparser_test.py [-h] {foo} ...
subparser_test.py: error: too few arguments
我正在按照https://stackoverflow.com/a/22994500/3061818中的建议设置required
属性,但是这给了我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.py
-改编自https://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)
相关问题:Why does this argparse code behave differently between Python 2 and 3?
你需要给
subparsers
一个dest
。现在:
为了发出此“缺少参数”错误消息,代码需要为该参数命名。对于位置参数(如子参数),该名称(默认情况下)为“dest”。在你链接的SO答案中有一个关于这个的(小)注释。
上一个Python版本中为数不多的
argparse
修补程序之一改变了它测试“必需”参数的方式。不幸的是,它引入了这个关于子攻击者的错误。这需要在下一个版本中修复(如果不是更早的话)。更新
如果您想在Py2中使用这种可选的子解析器行为,最好的选择是使用两级解析器,如
How to Set a Default Subparser using Argparse Module with Python 2.7
在相关的bug/问题中最近有一些活动
https://bugs.python.org/issue9253
更新
对此的修复正在进行中:https://github.com/python/cpython/pull/3027
相关问题 更多 >
编程相关推荐