带有所需子解析器的 Argparse

2023-11-22

我正在使用Python 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.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)

相关问题:为什么这个 argparse 代码在 Python 2 和 3 之间表现不同?


你需要给予subparsers a dest.

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

Now:

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

为了发出此“缺少参数”错误消息,代码需要为该参数指定一个名称。对于位置参数(如子解析),该名称(默认情况下)是“dest”。在您链接的 SO 答案中有一个关于此的(小)注释。

为数不多的“补丁”之一argparse在上一个 Python 版本中改变了它测试“必需”参数的方式。不幸的是,它引入了有关子解析器的错误。这需要在下一个版本中修复(如果不是更早的话)。

update

如果你想在 Py2 中使用这个可选的子解析器行为,看起来最好的选择是使用两阶段解析器,如

如何使用 Argparse 模块和 Python 2.7 设置默认子解析器

相关错误/问题最近有一些活动

https://bugs.python.org/issue9253

update

对此问题的修复正在进行中:https://github.com/python/cpython/pull/3027

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有所需子解析器的 Argparse 的相关文章

随机推荐