argpars中的命名参数

2024-05-01 21:15:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把参数按它们的名字发送到脚本(类似于kwargs)。 我试过这样的方法,但它并没有按我的要求做:(假设它是用script.py写的)

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

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

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


Tags: 方法namepyimport脚本addparser参数
3条回答

上面提到的这个问题有点误会,或者我有一个很大的误会。

*keyword和**keyword用于将参数/资料传递给python代码中的类/函数/方法。

argparse用于从外部/命令行向python程序传递参数/选项。所以你不会得到1对1的复制。然而,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'])

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

所以你可以做的是:

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

顺序无关紧要。

把你的论点改为

parser.add_argument('-name')

另外,问题是您从命令行调用。应该是这样的:

python script.py name david

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

“optionals”由标志字符串表示,类似于-f--foo。它们类似于Python函数的关键字参数,但不完全相同。顺序无关紧要。使用in-limits,标志可以连接到值,例如-f1--foo=astring

“位置”是按顺序标识的,没有任何标识名称。它们类似于Python函数的args。在函数中,所有位置参数都必须出现在关键字参数之前。使用argparse“optionals”可以与“positional”混合使用,但有一些限制。通常在选项之后提供所有位置,如argparse用法消息中所示。

看看argparse文档中的示例。

我们周期性地从那些想要绕过这些约定的人那里得到问题,例如希望使用不带前缀字符的flag,或者输入类似字典的对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

相关问题 更多 >