usage: [-h] [--foo FOO] bar
- 如果我执行以下命令,我该如何确保FOO的默认值为
abc
./myscript.py --foo bar
--> 这里bar
是位置参数。但是args.foo
将bar
视为'--foo'
的参数。我希望args.foo
为abc
,而bar
成为位置参数。
usage: [-h] [--foo FOO] bar
abc
./myscript.py --foo bar
--> 这里bar
是位置参数。但是args.foo
将bar
视为'--foo'
的参数。我希望args.foo
为abc
,而bar
成为位置参数。
如果不重新调整你的参数,你是无法做到的。
在这里,你应该使用两个开关;一个用于打开行为,另一个用于覆盖选择的默认值。你可以使第二个开关暗示第一个开关:
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'
你尝试使用--
将--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'])
foo_setting
但选择了另一个互斥的组选项,则这是一个错误,您需要手动检测。 - Martijn Pieters