前言

在一个需要用到flag作为信号控制代码中一些代码片段是否运行的,比如"--flag True"或者"--flag False"。

但是古怪的是无法传入False,无论传入True还是False,程序里面都是True的参数,所以这个flag并没有生效,也就失去了意义。

参考代码:

# test.py
import argparse def test_bool():
parser = argparse.ArgumentParser(description="This code is used to test bool value.")
parser.add_argument("--flag",
type=bool,
default=True)
args = parser.parse_args()
print("# The type of flag: ", type(args.flag))
print(args.flag is False) if args.flag:
print(f"# Flag: {True}")
else:
print(f"# Flag: {False}") if __name__ == '__main__':
test_bool()

执行上面的代码:python3 test.py --flag False

按照执行的期望是输出# Flag: False,但是实际输出的结果是True

(data_parse)  ~/Desktop/code/cython&numba  python3 test.py --flag False
# The type of flag: <class 'bool'>
False
# Flag: True

为什么会出现这种情况呢?因为,在命令行的输入会被python认为是字符串,并不是布尔类型。

解决方式一【推荐】

更改代码为:

# ***
parser.add_argument("--flag",
action="store_true",
help="Run or not.")
# ***

这样的话,当你不输入--flag的时候,默认为False;输入--flag的时候,才会触发True值。

看执行结果:

(data_parse)  ~/Desktop/code/cython&numba  python3 test.py
# The type of flag: <class 'bool'>
True
# Flag: False
(data_parse) ~/Desktop/code/cython&numba  python3 test.py --flag
# The type of flag: <class 'bool'>
False
# Flag: True

当然这种方式,你也可以指定action为store_false,不输入的时候--flag默认True,输入--flag触发False

解决方式二

这种方式稍微复杂一些,就是需要自己去写一个函数对输入的字符串值进行一个转换,由字符串转换为布尔值。

代码:

import argparse

def str2bool(v):
if isinstance(v, bool):
return v
if v.lower() in ('yes', 'true', 't', 'y', '1'):
return True
elif v.lower() in ('no', 'false', 'f', 'n', '0'):
return False
else:
raise argparse.ArgumentTypeError('Boolean value expected.') def test_bool():
parser = argparse.ArgumentParser(description="This code is used to test bool value.")
parser.add_argument("--flag",
type=str2bool,
default=True,
help="Run or not.")
args = parser.parse_args()
print("# The type of flag: ", type(args.flag))
print(args.flag is False)
if args.flag:
print(f"# Flag: {True}")
else:
print(f"# Flag: {False}") if __name__ == '__main__':
test_bool()

这样的话,当我们只要输入自定义函数中的那些对应TrueorFalse的选项,就能能触发对应的布尔类型。

看执行情况:

(data_parse)  ~/Desktop/code/cython&numba  python3 test.py
# The type of flag: <class 'bool'>
False
# Flag: True
(data_parse) ~/Desktop/code/cython&numba  python3 test.py --flag True
# The type of flag: <class 'bool'>
False
# Flag: True
(data_parse) ~/Desktop/code/cython&numba  python3 test.py --flag False
# The type of flag: <class 'bool'>
True
# Flag: False
(data_parse) ~/Desktop/code/cython&numba  python3 test.py --flag 0
# The type of flag: <class 'bool'>
True
# Flag: False
(data_parse) ~/Desktop/code/cython&numba  python3 test.py --flag 1
# The type of flag: <class 'bool'>
False
# Flag: True

由于默认了default的值为True,所以不输入--flag的时候就默认为True,然后输入--flag对应自定义func: str2bool()中的选项时,就能达到想要的开关效果。

python argparse传入布尔参数不生效解决的更多相关文章

  1. python argparse命令行参数

    测试: 第一个没有任何输出和出错 第二个测试为打印帮助信息,argparse会自动生成帮助文档 第三个测试为未定义的-v参数,会出错 第四个测试为未定义的参数foo,出错 positional arg ...

  2. python argparse:命令行参数解析详解

    简介 本文介绍的是argparse模块的基本使用方法,尤其详细介绍add_argument内建方法各个参数的使用及其效果. 本文翻译自argparse的官方说明,并加上一些笔者的理解 import a ...

  3. python解析传入的命令行参数 argv

    python解析命令行参数主要有三种方法:sys.argv.argparse解析.getopt解析 方法一:sys.argv —— 命令行执行:python test_命令行传参.py 1,2,3 1 ...

  4. Python argparse参数管理学习笔记1

    1.前言 最近尝试学习使用argparse进行参数管理,顺便改善一下我那丝毫都不专业的.简单粗暴的代码习惯. argparse模块可以让人轻松地编写用户友好地命令行接口,并且还能够自动生成帮助与使用手 ...

  5. 解决使用Mybatis 传入多参数使用map封装遇到的 “坑”问题

    好久没来写些东西了,今天 我分享一下自己遇到的一个“小 坑”,这也许对您来说不是个问题,但是我还是希望对没有遇到过这类问题的朋友给个小小的帮助吧 是这样的,需求:需要实现根据多条件 且分页展示数据 1 ...

  6. python 从外部获取传入的参数

    有时候我们在执行python程序的时需要接收到外部传入的参数 python的 sys.argv[]就能实现 # test.py import sys #引入模块 str = sys.argv[1]pr ...

  7. python函数传入参数(默认参数、可变长度参数、关键字参数)

    1.python中默认缺省参数----定义默认参数要牢记一点:默认参数必须指向不变对象! 1 def foo(a,b=1): 2 print a,b 3 4 foo(2) #2 1 5 foo(3,1 ...

  8. Python的命令行参数(argparse)

    参考:https://www.cnblogs.com/lindaxin/p/7975697.html 参考:https://www.cnblogs.com/dengtou/p/8413609.html ...

  9. Python MySQLdb中执行SQL语句传入的参数应该要加上引号如果该字段是str类型的

    如下图: username在表中是字符串类型的,所以传入的参数要加上引号

  10. (转) argparse — 解析命令参数和选项

    原文地址:https://pythoncaff.com/docs/pymotw/argparse-command-line-option-and-argument-parsing/166 https: ...

随机推荐

  1. go基础-接口

    一.概述 接口是面向对象编程的重要概念,接口是对行为的抽象和概括,在主流面向对象语言Java.C++,接口和类之间有明确关系,称为"实现接口".这种关系一般会以"类派生图 ...

  2. MySQL-char与 varchar 的区别?

    版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 1.共同点: 都是字符串类型 2.不同点: ①.char类型是定长数据类型.,对于数据插入的速度比较块,在有大量插入需 ...

  3. 小心C#中的只读结构体成员

    示例 我们先来看一段结构体的代码 (基于 VS2022 + .NET 8.0) public struct MyStruct(int number) { public int Number = num ...

  4. 跨境 ERP 积加系统与金蝶云星空系统数据集成对接方案

    方案简介 由于积加ERP 系统专注服务于亚马逊跨境电商是非常复杂和庞大的应用系统,具有非常丰富的业务流程.复杂的系统架构和服务接口.主要涉及系统解决店铺运营,店铺管理,供应链管理,协同智能补货.采用& ...

  5. DES加密技术概述与应用

    一.引言 随着信息技术的飞速发展,数据安全已成为越来越受到重视的问题.数据加密技术作为保障信息安全的核心技术之一,得到了广泛的研究和应用.DES(Data Encryption Standard)作为 ...

  6. [AI]重新审视“幻肢”现象背后的意识机制

    "幻肢"实验 "幻肢"实验是研究幻肢现象的经典实验方法.实验对象通常选择已经失去一肢如手或脚的病人.实验主要步骤是:首先安装一台镜头对残肢部位进行实时视频监测. ...

  7. Excel表格数据可视化的六大常见方式,看看你都会吗?

    当涉及到Excel表格数据的可视化,有许多不同的方式可以展示和呈现数据.以下是六种常见的Excel表格数据可视化方式的详细介绍. 1. 条形图(Bar Chart) 条形图是一种常见的数据可视化图表类 ...

  8. 功能不够,SQL来凑,修改数据库的正确姿势?

    修改数据库是一项关键任务,需要小心谨慎地执行,以确保数据的完整性和准确性.下面是一个详细的步骤指南,介绍了正确修改数据库的姿势. 第一步:备份数据库 在进行任何数据库修改之前,务必备份数据库.这样,如 ...

  9. lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O

    -- create a class Animal={name = "no_name" , age=0 } function Animal:bark(voice) print(sel ...

  10. NVIDIA RTX4090,你能用它做什么?

    都说男生是世界上最简单的动物,为什么呢?举个例子,你要给女朋友送礼,你可以选择包.口红.护肤品.化妆品等,而包的品牌和样式.口红的色号等足以让你挑得眼花缭乱.而男生不一样,如果女生选择给男生送礼,我相 ...