关于python:argparse中的命名参数

named argument in argparse

本问题已经有最佳答案,请猛点这里访问。

我想用他们的名字(比如Kwargs)把论点发送到脚本中。我试过这样的方法,但它没有做我想做的:(假设它是用script.py写的)

1
2
3
4
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("name")
args = parser.parse_args()

然后用逗号行书写:script.py name=david

还有一件事,假设我在argparse中没有命名参数,如果我不按声明的顺序发送它们,它还能正常工作吗?


所说的问题有点误解,或者我有一个很大的误解。

*关键字和**关键字用于将参数/内容传递到Python代码内的类/函数/方法。

argparse用于从外部/命令行向python程序传递参数/选项。所以你不会得到一对一的复制。然而,argparse是非常可配置的,根据您希望如何进行,您可以接近它。

如果只想传递一个名称,则:

1
2
3
4
5
6
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("name")
args = parser.parse_args()

print args

会让你:

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

如果要设置名称以便也可以发送其他内容:

1
parser.add_argument("-name")

会让你:

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

但注意:

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

然而:

1
parser.add_argument("--name")

允许/要求:

1
2
3
4
5
./pytest.py --name dave
Namespace(name='dave')

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

如果你:

1
2
3
4
parser.add_argument("--name", nargs="+")

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

但是:

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

(注意,最后一个列表中只有墨菲。)

所以你可以做的是:

1
2
3
4
5
6
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='[email protected]', hair_color='murphy', name='fred')

argparse和早期相同样式的命令行处理程序中,"选项"或标记参数和位置之间存在区别。

"期权"由一个标志字符串表示,类似于-f--foo。这些参数与Python函数的关键字参数类似,但不完全相同。命令无关紧要。在有限制的情况下,标记可以与值联接,例如-f1--foo=astring

"位置"是按顺序标识的,没有任何标识名。这些类似于Python函数的args。在函数中,所有位置参数都必须出现在关键字参数之前。使用argparse时,"期权"可以与"位置"混合,但有一些限制。如argparse用法消息所示,在期权之后提供所有位置是很常见的。

查看argparse文档中的示例。

我们定期从那些想绕过这些约定的人那里得到问题,例如希望使用不带前缀字符的标志,或者输入字典,如pairs、foo=testfoo:test。其中有些是可能的,但需要更多的工作。通常在清晰度和实用性方面没有什么收获。

我建议将script.py name = david传递给一个只显示sys.argv列表的脚本。这些是argparse必须使用的值。我希望你能看到:

1
['script.py', 'name', '=', 'david']

您的shell已将该命令行拆分为单独的字符串。对这个列表进行您自己的解析可能比将argparse扭曲成一个将它转换成的形式要容易得多。

argparse可以很容易地处理输入,比如

1
2
3
script.py --name david
script.py --name=david
script.py david


秩序无关紧要。

把你的论点改成

1
parser.add_argument('-name')

另外,错误的是从命令行调用。应该是这样的:

1
python script.py name david