usage: [-h] [--foo FOO] bar
abc
./myscript.py --foo bar
- > bar
是位置参数。但args.foo
正在考虑将bar
作为'--foo'
的参数。我希望args.foo
为abc
,bar
为位置参数
答案 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关于互斥组织的评论。