我试图获得以下行为:
当我使用
parser.add_argument('--foo',nargs='?', default=False, const=True)
但是,如果我添加type=bool
,试图强制强制强制转换为布尔值,它就会中断。在这种情况下
python test.py --foo False
实际上最终存储foo=True
。怎么回事??
对于布尔参数,应使用action='store\u true'
参数:
parser.add_argument('--foo', action='store_true')
因此,如果没有--foo
选项:
python test.py
将导致foo
参数的False
值,并且存在--foo
选项:
python test.py --foo
将导致foo
参数的True
值。
你确定你需要那个图案吗<代码>--foo和--foo
至于您的问题,请记住命令行值是一个字符串,
type=bool
表示您希望应用bool(输入的字符串值)
。对于——foo False
,这意味着bool(“False”)
,产生True
;所有非空字符串都为真!看看为什么argparse不能正确解析我的布尔标志?也
而不是支持
--foo
/--foo
parser.add_argument('--foo', default=False, action='store_true')
parser.add_argument('--no-foo', dest='foo', action='store_false')
--no foo
开关上添加的dest='foo'
确保它存储的False
值(通过store\u False
)最终位于相同的args.foo
属性上。
从Python 3.9开始,您还可以使用
argparse.BooleanOptionalAction
action类:
parser.add_argument("--foo", action=argparse.BooleanOptionalAction)
它将具有相同的效果,处理
--foo
和--no-foo
来设置和清除标志。
如果您有其他配置机制将把
foo
设置为True
,并且您需要用命令行开关再次覆盖它,那么您只需要一个--foo/--no-foo
组合-
如果您没有对
--no-foo
反转开关的特定需求(因为仅仅省略--foo
就意味着'false'),那么只需坚持使用action='store_true'
选项。这使您的命令行简单明了!
但是,如果您的用例或其他约束特别要求您的命令行必须具有某种对
--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
。
- 当根本不使用开关时,将使用
default=False
。 type=str\u to\u bool
用于处理--foo
演示:
$ 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'
问题内容: 我想使用argparse解析布尔命令行参数,写为“ –foo True”或“ –foo False”。例如: 但是,以下测试代码无法满足我的要求: 可悲的是,计算结果为。即使我更改为,情况也是如此,这令人惊讶,因为评估为。 如何获取argparse进行解析,以及它们的小写字母形式是什么? 问题答案: 另一个解决方案使用了先前的建议,但存在来自以下情况的“正确”解析错误: 这对于使用默认
问题内容: 我想使用argparse解析布尔命令行参数,写为。例如: 但是,以下测试代码不能满足我的要求: 可悲的是,计算结果为True。即使我更改为,情况也是如此,这令人惊讶,因为评估为。 如何获取进行解析,以及它们的小写字母形式是什么? 问题答案: 另一个解决方案使用了先前的建议,但存在来自以下情况的“正确”解析错误: 这对于使用默认值进行切换非常有用。例如 允许我使用:
我想使用argparse解析写为“--foo true”或“--foo false”的布尔命令行参数。例如: 但是,下面的测试代码并没有做我想做的事情: 遗憾的是,的计算结果为。即使我将更改为时也是如此,这是令人惊讶的,因为的计算结果为。 如何使argparse将、及其小写变体解析为?
当我想检查可选布尔值是否为真时,这样做行不通: 它会导致以下错误: 可选类型“@IvalueBool?”不能用作布尔值;测试'!=而不是零 我不想检查nil;我想检查返回的值是否为真。 如果布尔值==true,我是否总是必须执行
问题内容: 我有一个脚本,打算像这样使用: 是一个位置参数,其定义如下: 我希望它是可选的:未指定时,它应该只是。 不幸的是,当我不指定参数时,我得到了。 问题答案: 使用(或如果您需要多个目录) 扩展示例:
Argument选项在命令行上由其名称及其对应值表示。 例如,如果存在选项,则用户必须传递其值。 请考虑以下示例,如果我们将日志打印到某个文件,我们希望用户使用参数选项logFile输入日志文件的名称。 例子 (Example) CLITester.java import org.apache.commons.cli.CommandLine; import org.apache.commons.c