ukr*_*utt 55 python python-2.7 argparse python-3.x
我正在使用Python 3.4,我正在尝试使用argparsesubparsers,我希望在Python 2.x中有一个类似的行为,如果我不提供位置参数(表示subparser/subprogram)我会收到一条有用的错误消息.即,python2我将收到以下错误消息:
$ python2 subparser_test.py
usage: subparser_test.py [-h] {foo} ...
subparser_test.py: error: too few arguments
Run Code Online (Sandbox Code Playgroud)
我required按照/sf/answers/1609615031/中的建议设置了属性,但是这给我带来了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
Run Code Online (Sandbox Code Playgroud)
这是我的程序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)
Run Code Online (Sandbox Code Playgroud)
hpa*_*ulj 86
你需要给subparsers一个dest.
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='cmd')
subparsers.required = True
Run Code Online (Sandbox Code Playgroud)
现在:
1909:~/mypy$ argdev/python3 stack23349349.py
usage: stack23349349.py [-h] {foo} ...
stack23349349.py: error: the following arguments are required: cmd
Run Code Online (Sandbox Code Playgroud)
为了发出此"缺少参数"错误消息,代码需要为该参数指定名称.对于位置参数(如subsparses),该名称(默认情况下)为'dest'.在您链接的SO答案中有关于此的(小)注释.
上一篇argparsePython版本中为数不多的"补丁" 之一改变了它测试"必需"参数的方式.不幸的是,它引入了关于subparsers的这个bug.这需要在下一个版本中修复(如果不是更快).
如果你想在Py2中使用这个可选的subparsers行为,看起来最好的选择是使用两阶段解析器,如
如何使用带有Python 2.7的Argparse模块设置默认子分析程序
最近在相关的bug /问题中有一些活动
https://bugs.python.org/issue9253
对此的修复正在进行中:https://github.com/python/cpython/pull/3027
| 归档时间: |
|
| 查看次数: |
16649 次 |
| 最近记录: |