【问题标题】:Different result in IDE and command line, Boolean seems to change valueIDE和命令行的结果不同,布尔值似乎改变了值
【发布时间】: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。

【问题讨论】:

    标签: python command-line boolean spyder argparse


    【解决方案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
    • 谢谢,我会再次编辑,在末尾添加额外的引号。
    猜你喜欢
    • 1970-01-01
    • 2012-10-10
    • 2022-11-21
    • 2020-10-15
    • 2019-12-26
    • 1970-01-01
    • 2015-02-08
    • 2023-04-10
    • 2015-06-17
    相关资源
    最近更新 更多