Python argv“假,假”被识别为真[重复]

Posted

技术标签:

【中文标题】Python argv“假,假”被识别为真[重复]【英文标题】:Python argv "False, false' are recognized as True [duplicate] 【发布时间】:2021-05-28 14:25:30 【问题描述】:

我使用下面的行运行我的程序

python ***.py --if_normalize False

但我的程序将if_normalize 变量识别为True

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument("--work-path", required=True, type=str)
    parser.add_argument("--seed", default=42, type=int, help="Random seed")
    parser.add_argument("--batch-size", default=128, type=int)
    parser.add_argument("--attack", default='no', type=str)
    parser.add_argument("--gpu",default=2, type=int)
    parser.add_argument('--if_normalize', default=False, type=bool)
    return parser.parse_args()

args = parse_args()
print(args)

它打印 if_normalize is True

我通过了 'False, false, -1' 但它仍然识别为 True

【问题讨论】:

argparse 通常将参数用作“是否存在”而不是 True/False。所以parser.add_argument('--normalize', action='store_true')更合适。它要么在运行脚本时作为参数给出(True),要么根本不给出(False)。或与action='store_false' 反过来。如果你真的想要--if_normalize True/False,那么see the top 3 answers here。 【参考方案1】:

因为它只是通过bool 运行输入,而bool('False')True,因为任何非空字符串都是真实的。

您通常会使用 flag 来代替:

parser.add_argument('--if-normalize', action='store_true')

store_true 操作意味着默认为 False,如果存在该标志,则将其设置为 True。 IE。你会像这样使用它:

$ python ***.py --if-normalize

【讨论】:

【参考方案2】:

您应该更改为以下内容:

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

当您在调用脚本时将参数if_normalize 添加到命令行参数时,这会将参数True 设置为True

您可以参考docs 并查看它的确切作用。

【讨论】:

【参考方案3】:

https://docs.python.org/3/library/argparse.html#type

不建议将 bool() 函数用作类型转换器。它所做的只是将空字符串转换为 False,将非空字符串转换为 True。这通常不是我们想要的。

type 部分最近进行了扩展,旨在消除一些常见的误解,包括对bool(内置)函数的滥用。

您可以编写自己的函数来解析一大堆“是/否”字。开发人员拒绝这样做,因为有太多的替代方案,特别是如果包括非英语的可能性。

store_true Action 对于大多数用途来说已经足够了。

【讨论】:

以上是关于Python argv“假,假”被识别为真[重复]的主要内容,如果未能解决你的问题,请参考以下文章

pip 未被识别为内部命令 [重复]

控制结构逻辑的正确顺序(真/假、假/真)?

我收到此错误“'npx' 未被识别为内部或外部命令,” [重复]

spark中的CSV自定义模式[重复]

R中的列未被识别为变量[重复]

jackson xml 列出了被识别为重复键的反序列化