Python argparse:默认值或指定值

314

我希望添加一个可选参数,如果用户指定值,则存储用户指定的值,否则将默认为一个指定的值。是否已经有此类操作可用?

例如:

python script.py --example
# args.example would equal a default value of 1
python script.py --example 2
# args.example would equal a default value of 2

我可以创建一个动作,但想知道是否有现成的方法可以实现这个功能。

2个回答

439
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--example', nargs='?', const=1, type=int)
args = parser.parse_args()
print(args)

% test.py 
Namespace(example=None)
% test.py --example
Namespace(example=1)
% test.py --example 2
Namespace(example=2)
  • nargs='?' 表示0或1个参数
  • const=1 设定当没有参数时的默认值为1
  • type=int 将参数转换为整数类型

如果你想让test.py在没有指定--example的情况下,将example设置为1,请包括default=1。也就是说,使用:

parser.add_argument('--example', nargs='?', const=1, type=int, default=1)

然后

% test.py 
Namespace(example=1)

1
如何使用字符串实现这个?我在区分默认的空字符串""和用户输入的空字符串""时遇到了困境。目前的代码中,我正在使用默认值,由于需要执行一些操作,所以我有类似于self.foo = (args.bar or some_else_source).upper()的代码。如果出现None对象,它将会出错。 - 0andriy
4
注意:如果您尝试在之后使用位置参数,第一个位置参数将成为“--example”的值(如果没有显式指定)。我刚刚花了10分钟调试这个问题! - dsz
2
有没有办法让其接受一个可选的整数,并仍然区分位置字符串参数? - Frederick Nord

98

两者的区别:

parser.add_argument("--debug", help="Debug", nargs='?', type=int, const=1, default=7)
and
parser.add_argument("--debug", help="Debug", nargs='?', type=int, const=1)

因此:

myscript.py => 在第一种情况下,调试值为7(默认值),在第二种情况下为"None"

myscript.py --debug => 在每种情况下,调试值都为1

myscript.py --debug 2 => 在每种情况下,调试值都为2


4
这是描述这种差异的极好方式。 - TurnipEntropy
你的回答和之前的回答有矛盾... 根据之前的回答:myscript.py --debug 应该输出7。 - urie
欢迎您自行测试代码。如果我犯了错误,那对我们所有人都有帮助。 然而,我相信我已经正确地描述了我的测试结果。 Test.py会给出7,因为没有提供“--debug”参数,所以使用默认值。 Test.py --debug会给出1,这是由const设置的值。 - Murray
可能在运行代码时会出现问题,但是这个答案确实演示了如何使用argparse分配默认值,这正是问题的关键所在。 - AwfulPersimmon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接