Python 能否将关键字参数而不是位置参数传递给argparse?

Python 能否将关键字参数而不是位置参数传递给argparse?,python,arguments,argparse,Python,Arguments,Argparse,假设您有一个python函数,如下所示: def foo(spam, eggs, ham): pass 您可以仅使用位置参数来调用它(foo(1,2,3)),但也可以显式地说foo(spam=1,eggs=2,ham=3),或者混合使用这两个参数(foo(1,2,ham=3)) 是否可以使用argparse获得相同的功能?我有几个带关键字的位置参数,如果只使用一个,我不想定义所有参数。我相信这就是您要找的。您可以这样做: import argparse parser = argpars

假设您有一个python函数,如下所示:

def foo(spam, eggs, ham):
    pass
您可以仅使用位置参数来调用它(
foo(1,2,3)
),但也可以显式地说
foo(spam=1,eggs=2,ham=3)
,或者混合使用这两个参数(
foo(1,2,ham=3)


是否可以使用argparse获得相同的功能?我有几个带关键字的位置参数,如果只使用一个,我不想定义所有参数。

我相信这就是您要找的。

您可以这样做:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('foo',nargs='?',default=argparse.SUPPRESS)
parser.add_argument('--foo',dest='foo',default=None)

parser.add_argument('bar',nargs='?',default=argparse.SUPPRESS)
parser.add_argument('--bar',dest='bar',default=None)

parser.add_argument('baz',nargs='?',default=argparse.SUPPRESS)
parser.add_argument('--baz',dest='baz',default=None)

print parser.parse_args()
其主要工作原理如您所述:

temp $ python test.py 1 2 --baz=3
Namespace(bar='2', baz='3', foo='1')
temp $ python test.py --baz=3
Namespace(bar=None, baz='3', foo=None)
temp $ python test.py --foo=2 --baz=3
Namespace(bar=None, baz='3', foo='2')
temp $ python test.py 1 2 3
Namespace(bar='2', baz='3', foo='1')
python将为函数调用类比中的下一个错误提供一个错误,但argparse将允许:

temp $ python test.py 1 2 3 --foo=27.5
Namespace(bar='2', baz='3', foo='27.5')

您可能可以使用来解决这个问题,您也可以使用这个模块:

如果参数有默认值,我是否能够执行
test.py--baz=3
?@Glycan--您可以明智地使用
default=argparse.SUPPRESS
并显式设置默认值来解决这个问题。看我的最新消息。哦,那太糟糕了,这就是我想要的行为。我不喜欢毫无意义的黑客。@Glycan——你在寻找什么样的行为?如果两次指定foo,则会引发错误?如果要使用
--help
,可能需要在其中一个
add_参数上设置
help=argparse。如果不希望选项出现两次,则在其中一个
add_参数上抑制