可以将关键字参数传递给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
我觉得这就是你想要的内容,关于Argparse 默认值的介绍。
1
你还可以使用这个模块:docopt
6
你可以这样做:
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')
你可能可以通过使用互斥分组来解决这个问题。