argparse中的命名参数

dav*_*hko 7 python argparse

我想通过他们的名字(像kwargs这样的东西)向脚本发送参数.我试过这样的事情,但它没有做我想要的事情:(假设它是用script.py写的)

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("name")
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

然后用commant行写:script.py name = david

另外一件事,假设我在argparse中有几个命名参数如果我不按照它们被声明的顺序发送它们它还能运行吗?

Pet*_*tro 13

所陈述的问题包含一些误解,或者我有一个很大的误解.

*keyword和**关键字用于将参数/东西传递给类/函数/方法INSIDE python代码.

argparse用于从外部/命令行将参数/选项传递给python程序.所以你不会得到1对1的复制它.然而,argparse是可配置的,根据你想要的方式,你可以接近.

如果您只想传递一个名称,那么:

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

print args
Run Code Online (Sandbox Code Playgroud)

会让你:

$ ./pytest.py dave
Namespace(name='dave')
Run Code Online (Sandbox Code Playgroud)

如果你想设置名称,你也可以发送其他东西:

parser.add_argument("-name")
Run Code Online (Sandbox Code Playgroud)

会让你:

./pytest.py -name dave
Namespace(name='dave')
Run Code Online (Sandbox Code Playgroud)

但请注意:

 ./pytest.py -name dave -name steve
 Namespace(name='steve')
Run Code Online (Sandbox Code Playgroud)

然而:

parser.add_argument("--name")
Run Code Online (Sandbox Code Playgroud)

将允许/要求:

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

./pytest.py --name=dave
Namespace(name='dave')
Run Code Online (Sandbox Code Playgroud)

如果你:

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

./pytest.py --name dave steve murphy
Namespace(name=['dave', 'steve', 'murphy'])
Run Code Online (Sandbox Code Playgroud)

但:

 ./pytest.py --name=dave --name=steve --name=murphy      
 Namespace(name=   ['murphy'])
Run Code Online (Sandbox Code Playgroud)

(请注意,最后一个是仅包含墨菲的列表.)

所以你能做的是:

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')
Run Code Online (Sandbox Code Playgroud)


hpa*_*ulj 5

argparse, 和早期相同风格的命令行处理器中,“可选”或标记参数和位置之间存在区别。

'options' 由标志字符串表示,例如-for --foo。这些类似于 Python 函数的关键字参数,但不完全相同。顺序无关紧要。在限制条件下,标志可以连接到值,例如-f1--foo=astring

“位置”按顺序标识,没有任何标识名称。这些类似于argsPython 函数的 。在函数中,所有位置参数都必须出现在关键字参数之前。随着argparse一些限制- “自选”可以用“positionals”混合。如argparse用法消息中所示,通常在可选项之后提供所有位置。

查看argparse文档中的示例。

我们会定期收到想要规避这些约定的人的问题,例如希望使用没有前缀字符的标志,或者像对这样的字典输入,foo=test或者foo:test. 其中一些是可能的,但需要更多的工作。并且通常在清晰度和实用性方面几乎没有收获。

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

['script.py', 'name', '=', 'david']
Run Code Online (Sandbox Code Playgroud)

您的 shell 已将该命令行拆分为单独的字符串。对该列表进行自己的解析可能比argparse将其扭曲成一种形式更容易。

Argparse 可以轻松处理输入,例如

script.py --name david
script.py --name=david
script.py david
Run Code Online (Sandbox Code Playgroud)


小智 0

顺序并不重要。

将你的论点改为

parser.add_argument('-name')
Run Code Online (Sandbox Code Playgroud)

另外,问题在于您从命令行进行的调用。它应该看起来像这样:

python script.py name david
Run Code Online (Sandbox Code Playgroud)