Python 2.7 python argparse可选参数的默认值 如果我像下面这样执行脚本,如何确保FOO的默认值是abc

Python 2.7 python argparse可选参数的默认值 如果我像下面这样执行脚本,如何确保FOO的默认值是abc,python-2.7,argparse,Python 2.7,Argparse,/myscript.py--foo-bar-->bar是此处的位置参数。但是args.foo正在考虑将bar作为'--foo'的参数。我希望args.foo成为abc和bar成为位置参数你不能,除非重新修改你的参数 你应该在这里使用两个开关;一个用于打开行为,另一个用于覆盖拾取的默认值。您可以使第二个开关暗示第一个开关: usage: [-h] [--foo FOO] bar 其中,--foo是切换行为的布尔开关,--foo设置允许您设置开关的配置: usage: [-h] [--foo]

/myscript.py--foo-bar
-->
bar
是此处的位置参数。但是
args.foo
正在考虑将
bar
作为
'--foo'
的参数。我希望
args.foo
成为
abc
bar
成为位置参数

你不能,除非重新修改你的参数

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

usage:  [-h] [--foo FOO] bar
其中,
--foo
是切换行为的布尔开关,
--foo设置
允许您设置开关的配置:

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

您是否尝试过使用
--
--foo
参数与
分开


使用此基本设置:

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'
普通的
--foo
可以出现在
之后另一个'('default
)是不存在时获取的值,'abc'(the
const`)是存在时获取的值,但为“空”

但正如您所发现的,当
--foo
是第一个时,它会使用下面的字符串,不会为
位置
参数留下任何内容。换句话说,在处理
--foo
时,它没有考虑
的未来需求

如果我再加一个论点

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'
这是因为
--baz
标志着
--foo
参数的结束

您还可以使用
--
标记
选项的结束
帖子的开始

p.add_argument('--baz',action='store_true')
p.parse_args(['--foo','--baz','bar'])
# Namespace(bar='bar', baz=True, foo='abc')
有一个
错误问题
,它试图通过为尾部
位置保留字符串来纠正此问题
argparse选项的nargs='?'、'*'或'+'后面不能跟位置

但这个补丁并非微不足道<代码>--是目前最好的工具


我不理解您对Martijn关于互斥组的评论。

问题是,我想添加到互斥组。一组中有多个选项吗?@tez:没有;但您可以在解析后自由添加其他测试。如果设置了
foo_设置
,但选择了另一个互斥组选项,则需要手动检测该错误。
p.parse_args(['--foo','--','bar'])