argparse中的命名参数

9

我希望能够通过名称将参数发送到脚本(类似于kwargs)。 我尝试过类似如下的方式,但它并没有实现我的需求:(假设它是在script.py中编写的)

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("name")
args = parser.parse_args()

然后在命令行中输入:script.py name = david。

另外,假设我在argparse中有几个命名参数,如果我发送它们的顺序与它们声明的顺序不同,它是否仍然能正常工作?


这个链接可能会有所帮助 https://dev59.com/3Gs05IYBdhLWcg3wIedj#22045954 - tom
3个回答

25
所提出的问题存在一些误解,或者我有一个大误解。
*keyword 和 **keyword 用于将参数/内容传递给 Python 代码内部的类/函数/方法。
argparse 用于从外部/命令行向 Python 程序传递参数/选项。因此,您不会得到一对一的复制。但是 argparse 是非常可配置的,根据您的需要,您可以做到接近。
如果您只想传递一个名称,那么:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("name")
args = parser.parse_args()

print args

让您能够:

$ ./pytest.py dave
Namespace(name='dave')

如果你想设置名称,这样你也可以发送其他材料:

parser.add_argument("-name")

让你能够:

./pytest.py -name dave
Namespace(name='dave')

但请注意:

 ./pytest.py -name dave -name steve
 Namespace(name='steve')

然而:

parser.add_argument("--name")

允许/要求:

./pytest.py --name dave
Namespace(name='dave')

./pytest.py --name=dave
Namespace(name='dave')

如果你:

parser.add_argument("--name", nargs="+")

./pytest.py --name dave steve murphy
Namespace(name=['dave', 'steve', 'murphy'])

但是:

 ./pytest.py --name=dave --name=steve --name=murphy      
 Namespace(name=   ['murphy'])

(请注意,最后一个列表中只有Murphy。)

因此,您可以这样做:

parser.add_argument("--name")
parser.add_argument("--email")
parser.add_argument("--hair-color")

./pytest.py --name fred --hair-color murphy --email example@example.com
Namespace(email='example@example.com', hair_color='murphy', name='fred')

7
argparse 和同类早期的命令行处理程序中,有“可选”或标记参数和位置参数的区别。
“可选”由标志字符串表示,类似于 -f--foo。 这类似于 Python 函数的关键字参数,但并非完全相同。 顺序无关紧要。 在限制范围内,可以将标志与值连接在一起,例如 -f1--foo=astring
“位置参数”是按顺序标识的,没有任何标识名称。这类似于 Python 函数的 args。 在函数中,所有位置参数都必须出现在关键字参数之前。 使用 argparse,可以混合使用“可选”和“位置参数” - 在某些限制下。 通常在选项之后提供所有位置参数,如 argparse 的用法消息所示。
请查看 argparse 文档中的示例。
我们定期收到来自希望规避这些惯例的人的问题,例如期望使用不带前缀字符的标志,或输入类似于字典的对,foo=testfoo:test。 这是可能的,但需要更多的工作。 而且通常对清晰度和实用性的收益很小。
我建议将 script.py name=david 传递给一个只显示 sys.argv 列表的脚本。 这些是 argparse 必须使用的值。 我希望您会看到:
['script.py', 'name', '=', 'david']

你的shell已经将命令行拆分成了单独的字符串。自己解析这个列表可能比扭曲argparse更容易。

argparse可以轻松处理像以下这样的输入:

script.py --name david
script.py --name=david
script.py david

0

顺序不重要。

将您的参数更改为

parser.add_argument('-name')

另外,你从命令行调用的方式有问题。应该像这样:

python script.py name david

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接