可以将关键字参数传递给argparse,而不是位置参数吗?

4 投票
3 回答
3438 浏览
提问于 2025-04-17 14:03

假设你有一个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')

你可能可以通过使用互斥分组来解决这个问题。

撰写回答