gpt4 book ai didi

python - 'argparse' 带有以破折号开头的可选位置参数

转载 作者:行者123 更新时间:2023-11-28 21:39:10 25 4
gpt4 key购买 nike

我们正在尝试通过我们正在使用的命令行工具构建包装器脚本。我们想根据包装器脚本中的选项设置一些工具参数。我们还希望有可能将 native 参数直接传递给命令行工具,因为它们是在命令行上编写的。

这是我们的结论:

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('positional')
parser.add_argument('-f', '--foo', action='store_true')
parser.add_argument('-b', '--bar', action='store_true')

parser.add_argument('native_arg', nargs='*')

args = parser.parse_args()
print (args)

positional 是强制性的。基于选项 -f-b 我们将向我们的工具调用添加一些额外的选项。之后留下的任何东西(如果有的话)都应该被视为 native 工具参数并直接提供给工具。使用 -h 调用我们的脚本会产生以下用法:

usage: test.py [-h] [-f] [-b] positional [native_arg [native_arg ...]]

诀窍在于,这些 native 参数本身就是工具的选项,并且包含前导破折号,例如 -native0-native1。我们已经知道使用双破折号阻止 argparse 寻找更多选项的技巧。以下调用:

./test.py pos -- -native0 -native1

产生预期的解析参数:

Namespace(bar=False, foo=False, native_arg=['-native0', '-native1'], positional='pos')

不过,尝试在第一个位置参数之后添加一个选项是行不通的。更具体地说,以下调用:

./test.py pos --foo -- -native0 -native1

产生以下输出:

usage: [...shortened...]
test.py: error: unrecognized arguments: -- -native0 -native1

将可选参数放在位置之前:

./test.py --foo pos -- -native0 -native1

似乎有效,因为打印了以下内容:

Namespace(bar=False, foo=True, native_arg=['-native0', '-native1'], positional='pos')

更奇怪的是,将 native_argnargs 的值更改为 '+' 在上述所有情况下都有效(需要注意的是,当然,至少需要一个 native_arg

我们的 Python 代码是不是做错了什么,或者这是某种 argparse 错误?

最佳答案

argparse 在您将非必需的位置参数与可选参数混合时确实会遇到困难(有关错误报告的详细信息,请参阅 https://stackoverflow.com/a/47208725/1399279)。我不会提出解决此问题的方法,而是提出一种替代方法。

您应该查看 parse_known_args方法,它是为您描述的情况创建的(即将选项传递给包装工具)。

In [1]: import argparse

In [2]: parser = argparse.ArgumentParser()

In [3]: parser.add_argument('positional')

In [4]: parser.add_argument('-f', '--foo', action='store_true')

In [5]: parser.add_argument('-b', '--bar', action='store_true')

In [6]: parser.parse_known_args(['pos', '--foo', '-native0', '-native1'])
Out[6]: (Namespace(bar=False, foo=True, positional='pos'), ['-native0', '-native1'])

parse_args 不同,parse_known_args 的输出是一个二元组。第一个元素是您希望从 parse_args 获得的 Namespace 实例,它包含通过调用 add_argument 定义的所有属性。第二个元素是解析器未知的所有参数的列表。

我个人更喜欢这种方法,因为用户不需要记住任何关于如何调用你的程序的技巧,或者哪个选项顺序不会导致错误。

关于python - 'argparse' 带有以破折号开头的可选位置参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47205477/

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