当前位置: 首页 > 知识库问答 >
问题:

argparse可选布尔[重复]

刘令
2023-03-14

我试图获得以下行为:

  • python test.py=

当我使用

    parser.add_argument('--foo',nargs='?', default=False, const=True)

但是,如果我添加type=bool,试图强制强制强制转换为布尔值,它就会中断。在这种情况下

python test.py --foo False

实际上最终存储foo=True。怎么回事??

共有2个答案

宋新知
2023-03-14

对于布尔参数,应使用action='store\u true'参数:

parser.add_argument('--foo', action='store_true')

因此,如果没有--foo选项:

python test.py

将导致foo参数的False值,并且存在--foo选项:

python test.py --foo

将导致foo参数的True值。

后安民
2023-03-14

你确定你需要那个图案吗<代码>--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.BooleanOptionalActionaction类:

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