Python argparse可选参数的默认值

3
usage:  [-h] [--foo FOO] bar
  1. 如果我执行以下命令,我该如何确保FOO的默认值为abc

./myscript.py --foo bar --> 这里bar是位置参数。但是args.foobar视为'--foo'的参数。我希望args.fooabc,而bar成为位置参数。

2个回答

3

如果不重新调整你的参数,你是无法做到的。

在这里,你应该使用两个开关;一个用于打开行为,另一个用于覆盖选择的默认值。你可以使第二个开关暗示第一个开关:

usage: [-h] [--foo] [--foo-setting FOO] bar

其中,--foo 是一个布尔开关,用于切换行为,而 --foo-setting 则允许您设置该开关的配置:

parser.add_argument('--foo', action='store_true')
parser.add_argument('--foo-setting', help='Set the value for foo, implies --foo is given')

# ...
args = parser.parse_args()

if args.foo_setting is not None:
    # default was overridden, explicitly enable the foo feature
    args.foo = True

if args.foo:
    foo_feature_setting = args.foo_setting or 'default value'

问题是,我想添加到互斥组。在一组中是否可以有多个选项? - tez
@tez:不需要,但在解析后您可以自由添加其他测试。如果设置了 foo_setting 但选择了另一个互斥的组选项,则这是一个错误,您需要手动检测。 - Martijn Pieters

1

你尝试使用----foo参数与bar分隔开了吗?


使用这个基本设置:
p=argparse.ArgumentParser()
p.add_argument('--foo',nargs='?',const='abc', default='other')
p.add_argument('bar')

In [633]: p.parse_args(['bar'])
Out[633]: Namespace(bar='bar', foo='other')

In [634]: p.parse_args(['bar','--foo'])
Out[634]: Namespace(bar='bar', foo='abc')

In [635]: p.parse_args(['bar','--foo','test'])
Out[635]: Namespace(bar='bar', foo='test')

In [636]: p.parse_args(['--foo','bar'])
usage: ipython3 [-h] [--foo [FOO]] bar
'error message'

--foo可以在bar之后出现。如果没有指定值,则使用“other”(默认)作为其值;如果存在但为空,则使用“abc”(const)作为其值。

但是,正如您发现的那样,在首次处理--foo时,它会消耗其后面的字符串,留下空白给positional参数。换句话说,在处理--foo时,它不会考虑bar的未来需求。

如果我添加另一个参数

p.add_argument('--baz',action='store_true')
p.parse_args(['--foo','--baz','bar'])
# Namespace(bar='bar', baz=True, foo='abc')

这是有效的原因是--baz标记了--foo参数的结束。
你也可以使用--来标记可选项的结尾和位置参数的开头:
p.parse_args(['--foo','--','bar'])

有一个“错误问题”,尝试通过为尾随的“位置参数”保留字符串来纠正此问题。http://bugs.python.org/issue9338“argparse选项(nargs ='?','*'或'+')后面不能跟随位置参数”
但这个补丁并不是微不足道的。“--”是您目前最好的工具。
我不明白您对Martijn关于互斥组的评论。

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