【发布时间】:2019-04-09 00:52:06
【问题描述】:
# bird.py
from argparse import ArgumentParser, SUPPRESS
parser = ArgumentParser(argument_default=SUPPRESS)
parser.add_argument('--dead', action='store_true')
subparsers = parser.add_subparsers()
subparser = subparsers.add_parser('parrot', parents=[parser], add_help=False)
subparser.add_argument('--volts', type=int)
args = parser.parse_args()
print(args)
上面的脚本bird.py 在 Python 3 上按预期工作。但在 Python 2.7 上它不会解析参数:
$ python3 bird.py parrot --volts 4000000
Namespace(volts=4000000)
$ python2 bird.py parrot --volts 4000000
usage: bird.py parrot [-h] [--dead] [--volts VOLTS] {parrot} ...
bird.py parrot: error: too few arguments
据我所知,代码中没有使用任何仅 py3 的功能。为什么不一样?如何更新此代码以便 CLI 也可以支持 Python 2.7,无需以任何方式修改其 Python 3 行为?
【问题讨论】:
-
最新的 Py3 允许我们在
add_subparsers命令中指定required=True,使其行为更像 Py2(但一定要设置dest='cmd')。 Py3 有一个更丰富的缺失参数消息。在 Py2 中无法关闭所需的子解析器。 -
是否'--dead parrot --volts 200' 在子解析器中实际设置
dead=True'? I think thedefault=False` 会覆盖在主解析器中设置的任何值。从用户的角度来看,定义一个在主解析器和子解析器中都有效的参数可能很好,但以可靠的方式实现却很棘手。 -
嗯,由于您描述的原因,实际上它在此 MCVE 中不起作用。在实际情况下,我使用的是
argparse.SUPPRESS,我错误地认为这与这里无关 - 我已经更新了代码以制作更好的 MCVE。 -
您可以尝试使用
argparse.py的本地副本。 py3 版本应该在 py2 中运行,只需进行一些更改(例如将yield from恢复为其原始形式)。
标签: python python-2.7 argparse