IDE和命令行的结果不同,布尔值似乎改变了值

Posted

技术标签:

【中文标题】IDE和命令行的结果不同,布尔值似乎改变了值【英文标题】:Different result in IDE and command line, Boolean seems to change value 【发布时间】:2021-01-02 16:02:07 【问题描述】:

我有一个 Python 3 程序,其中我有一个奇怪的行为,我将其简化为下面非常基本的 MWE:

# -*- coding: utf-8 -*-
# basic_test.py
import argparse

def fun(arg1):
    print("arg1 value right before test: ", arg1)
    if arg1:
        print("inside test")

# fun(False) # comment if not in IDE mode

### comment following section if in IDE mode
if __name__ == "__main__":
    argparser = argparse.ArgumentParser()
    argparser.add_argument("-a")

    args = argparser.parse_args()

    fun(args.a)

如果我通过调用python basic_test.py -a False 在命令行中运行上面的代码,我会得到以下奇怪的(在我看来)输出:

arg1 value right before test:  False
inside test

所以不知何故,arg1 在一行是False,而在下一行是True,因为输入了if 部分?为什么会这样?

此外,如果我注释“main”部分,并取消注释行 fun(False),并将该代码运行到 IDE(在我的情况下为 Spyder),它会按我的预期运行,并具有以下输出:

arg1 value right before test:  False

所以它确实没有进入if 部分。

如果这很重要,我正在 Windows 上运行 Python 3.7.6。

【问题讨论】:

【参考方案1】:

False 你从 argparse 得到的是字符串,不像你的综合检查,它是实际的布尔值。

Argparse 没有对布尔文字的隐式解析,因此除了手动解析之外,最好的方法是使用 action='store_false' 并将参数作为标志传递

【讨论】:

我明白了,我应该修改什么来克服这个问题?更改fun,或更改add_argument,或两者兼而有之,还是其他? 这也归结为我觉得如何从命令行传递布尔值? 回答我自己:doingargparser.add_argument("--a", action='store_false') 的工作原理是,如果你写python basic_test.py --a,那么它的行为就像False,如果你像python basic_test.py 一样省略--a,那么它表现为True 确实,store-* 选项适用于类似标志的情况。我已经更新 unswer 谢谢,我会再次编辑,在末尾添加额外的引号。

以上是关于IDE和命令行的结果不同,布尔值似乎改变了值的主要内容,如果未能解决你的问题,请参考以下文章

改变静态布尔值

java布尔值在被调用方法中没有改变[重复]

PRESTO 中使用布尔值输出结果的有效方法

最终布尔值正在改变值

在搜索现有成员的链表时返回布尔结果 - java

从 void 和 boolean 方法返回多个值