你需要那个图案吗?--foo
和--foo <value>
加在一起,对于布尔switch 来说,不是常用的模式.
至于您的问题,请记住命令行值是string,type=bool
表示希望应用bool(entered-string-value)
.对于--foo False
,这意味着bool("False")
,产生True
;所有非空字符串都是真的!参见Why is argparse not parsing my boolean flag correctly?.
与支持--foo
/--foo <string value>
不同,我建议您使用--foo
表示True
,删除参数值,并添加--no-foo
选项以显式设置False
:
parser.add_argument('--foo', default=False, action='store_true')
parser.add_argument('--no-foo', dest='foo', action='store_false')
--no-foo
switch 上的dest='foo'
加法确保它存储的False
值(通过store_false
)最终位于相同的args.foo
属性上.
从Python 3.9开始,还可以使用argparse.BooleanOptionalAction
action类:
parser.add_argument("--foo", action=argparse.BooleanOptionalAction)
它会有同样的效果,处理--foo
和--no-foo
来设置和清除标志.
如果您有一些其他配置机制,将foo
设置为True
,并且需要使用命令行switch 再次覆盖,那么您只需要--foo / --no-foo
个组合.--no-<option>
是一个广泛采用的标准,用于反转布尔命令行switch .
如果你特别需要一个--no-foo
反转switch (因为只有omitting --foo
就意味着"假"),那么就坚持action='store_true'
选项.这使您的命令行简单明了!
但是,如果您的用例或其他约束特别要求您的命令行must具有一些--foo (true|false|0|1)
王支持,那么添加您自己的转换器:
def str_to_bool(value):
if isinstance(value, bool):
return value
if value.lower() in {'false', 'f', '0', 'no', 'n'}:
return False
elif value.lower() in {'true', 't', '1', 'yes', 'y'}:
return True
raise ValueError(f'{value} is not a valid boolean value')
parser.add_argument('--foo', type=str_to_bool, nargs='?', const=True, default=False)
const
值用于省略参数值的nargs='?'
个参数.在这里,当使用--foo
时设置foo=True
.
- 当根本不使用switch 时,使用
default=False
.
type=str_to_bool
用于处理--foo <value>
案件.
演示:
$ cat so52403065.py
from argparse import ArgumentParser
parser = ArgumentParser()
def str_to_bool(value):
if value.lower() in {'false', 'f', '0', 'no', 'n'}:
return False
elif value.lower() in {'true', 't', '1', 'yes', 'y'}:
return True
raise ValueError(f'{value} is not a valid boolean value')
parser.add_argument('--foo', type=str_to_bool, nargs='?', const=True, default=False)
print(parser.parse_args())
$ python so52403065.py
Namespace(foo=False)
$ python so52403065.py --foo
Namespace(foo=True)
$ python so52403065.py --foo True
Namespace(foo=True)
$ python so52403065.py --foo no
Namespace(foo=False)
$ python so52403065.py --foo arrbuggrhellno
usage: so52403065.py [-h] [--foo [FOO]]
so52403065.py: error: argument --foo: invalid str_to_bool value: 'arrbuggrhellno'