python argparse可选参数

时间:2015-04-24 12:22:11

标签: python-2.7 argparse

usage:  [-h] [--foo FOO] bar
  1. 如果我执行下面的脚本,如何确保FOO的默认值为abc
  2. ./myscript.py --foo bar - > bar是位置参数。但args.foo正在考虑将bar作为'--foo'的参数。我希望args.fooabcbar为位置参数

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分: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之后发生。 '其他' ('默认) is the value it gets if absent, 'abc' (the 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参数的结束。

您还可以使用--标记optionals的结尾和postionals的开头:

p.parse_args(['--foo','--','bar'])

有一个bug issue试图通过为尾随positionals保留字符串来纠正此问题 http://bugs.python.org/issue9338 argparse optionals with nargs='?', '*' or '+' can't be followed by positionals

但补丁并非无足轻重。 --是您目前最好的工具。

我不会跟随你对Martijn关于互斥组织的评论。