gpt4 book ai didi

python - 位置参数之前的 argparse 可选参数

转载 作者:太空狗 更新时间:2023-10-29 17:50:39 27 4
gpt4 key购买 nike

我想知道是否可以让一个位置参数跟在一个带有可选参数的参数后面。理想情况下,输入命令行的最后一个参数将始终应用于“testname”。

import argparse
parser = argparse.ArgumentParser(description='TAF')
parser.add_argument('-r','--release',nargs='?',dest='release',default='trunk')
parser.add_argument('testname',nargs='+')
args = parser.parse_args()

我希望这两个调用都将 smoketest 应用于 testname,但第二个调用会导致错误。

>> python TAF.py -r 1.0 smoketest
>> python TAF.py -r smoketest
TAF.py: error: too few arguments

我意识到将位置参数移到前面会导致可选参数的正确行为,但这并不是我正在寻找的格式。选择标志看起来是一个有吸引力的选择,但它会抛出一个错误,而不是忽略不匹配的项目。

编辑:我找到了一个 hacky 的方法来解决这个问题。如果有人有更好的解决方案,我将不胜感激。

import argparse
parser = argparse.ArgumentParser(description='TAF')
parser.add_argument('-r','--release',nargs='?',dest='release',default='trunk')
parser.add_argument('testname',nargs=argparse.REMAINDER)
args = parser.parse_args()

if not args.testname:
args.testname = args.release
args.release = ''

最佳答案

documentation 中所述:

'?'. One argument will be consumed from the command line if possible, and produced as a single item. If no command-line argument is present, the value from default will be produced. Note that for optional arguments, there is an additional case - the option string is present but not followed by a command-line argument. In this case the value from const will be produced.

因此,使用 '?' 无法获得您想要的行为。也许您可以使用 argparse.Action 编写一些 hack 并干预之前的结果。(1)

我认为更好的解决方案是拆分该选项的功能。使它成为一个需要参数的选项(但选项本身是可选的)并添加一个不带参数的选项,将发布设置为 'trunk'。通过这种方式,您无需任何破解即可获得相同的结果。我也认为界面更简单。

在你的例子中:

python TAF.py -r smoketest

很明显,smoketest 将被解释为 -r 的参数。至少遵循 unix 约定。如果您想保留 nargs='?',则用户必须使用--:

$ python TAF.py -r -- sometest
Namespace(release=None, testname=['sometest']) #parsed result

(1) 关于如何做到这一点的想法:检查选项是否有参数。如果它有一个检查它是否是一个有效的测试名称。如果是的话,手动放入testname,然后设置release为默认值。您还必须设置一个“标志”,告诉您这件事发生了。

现在,在解析 sys.argv 之前,您必须重定向 sys.stderr。进行解析时,您必须捕获 SystemExit,检查 stderr 并查看错误是否为“参数太少”,检查是否设置了标志,如果设置了则忽略错误并继续运行,否则你应该重新打印到原来的stderr错误信息并退出。

这种方法看起来不够健壮,而且可能有问题。

关于python - 位置参数之前的 argparse 可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13346540/

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