【问题标题】:argparse optional argument before positional argument位置参数之前的 argparse 可选参数
【发布时间】:2012-11-12 15:29:58
【问题描述】:

我想知道是否可以在带有可选参数的参数后面加上位置参数。理想情况下,输入到命令行的最后一个参数将始终适用于“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

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

编辑: 我找到了一种解决方法。如果有人有更好的解决方案,我将不胜感激。

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 = ''

【问题讨论】:

    标签: python argparse


    【解决方案1】:

    documentation中所述:

    '?'。如果可能,将从命令行使用一个参数, 并作为单个项目生产。如果不存在命令行参数, 将产生默认值。请注意,对于可选 参数,还有一种情况 - 存在选项字符串 但后面没有命令行参数。在这种情况下,价值 将产生 from const。

    因此,使用'?' 无法获得您想要的行为。也许您可以使用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报错信息并退出。

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

    【讨论】:

    • 感谢您的回复。我同意这可以通过为 testname 参数添加前缀,或者正如我提到的那样在另一个参数之前列出它们来干净地完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 2011-05-27
    • 2023-04-02
    • 2019-04-13
    • 2014-12-29
    相关资源
    最近更新 更多