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

时间:2013-01-29 14:53:49

标签: 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获得相同的功能?我有几个关键字的位置参数,我不想在只使用一个时定义所有这些参数。

3 个答案:

答案 0 :(得分:4)

您可以这样做:

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

您可以使用mutually exclusive groupings

来解决这个问题

答案 1 :(得分:1)

您也可以使用此模块:docopt

答案 2 :(得分:0)

我相信这正是您所寻找的Argparse defaults