首页 > 解决方案 > IDE和命令行的结果不同,布尔值似乎改变了值

问题描述

我有一个 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

所以不知何故arg1False在一行,但True在下一行,因为if进入了该部分?为什么会这样?

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

arg1 value right before test:  False

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

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

标签: pythoncommand-linebooleanspyderargparse

解决方案


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

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


推荐阅读