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和命令行的结果不同,布尔值似乎改变了值的主要内容,如果未能解决你的问题,请参考以下文章