gpt4 book ai didi

python - 子解析器 argparse "error: too few arguments"

转载 作者:行者123 更新时间:2023-12-01 08:50:10 33 4
gpt4 key购买 nike

# 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 行为

最佳答案

parent 复制的内容比您想要的多。 parents 尝试复制父级的子解析器,最终尝试使 subparser 成为其自身的子解析器。在 Python 3 上,子解析器默认是可选的,因此 parrot 没有获得自己的 parrot 并不是一个错误。在 Python 2 上,需要子解析器,因此 parrot 需要自己的 parrot 并提示没有得到它。 (考虑到您在尝试将父解析器用作父解析器时通过添加子解析器来修改父解析器,如果超过此损坏,我不会感到惊讶。)

不要尝试使用解析器作为其自己的子解析器的父解析器,而是创建一个单独的父解析器并将其用作顶级解析器和 parrot 子解析器的父解析器:

from argparse import ArgumentParser

shared = ArgumentParser(add_help=False)
shared.add_argument('--dead', action='store_true')

parser = ArgumentParser(parents=[shared])
subparsers = parser.add_subparsers()
subparser = subparsers.add_parser('parrot', parents=[shared])
subparser.add_argument('--volts', type=int)
args = parser.parse_args()
print(args)

结果:

$ python2 bird.py parrot --volts 4000000
Namespace(dead=False, volts=4000000)
$ python3.6 bird.py parrot --volts 4000000
Namespace(dead=False, volts=4000000)

但是,还有更多问题,因为您向父级和子级添加了 --dead 选项,并且它们试图写入同一个位置。 child 似乎优先:

$ python bird.py --dead parrot
Namespace(dead=False, volts=None)
$ python bird.py parrot --dead
Namespace(dead=True, volts=None)

如果顶级解析器和子解析器具有不同的 dest 值,或者如果它们有其他操作,则为它们提供 --dead 选项可能是有意义的比 store_true 更好,但是就你现在的方式来说,它没有多大意义。如果您想要不同的 dest 值,我认为您不能使用 parents 机制来实现此目的。

关于python - 子解析器 argparse "error: too few arguments",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53158180/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com