前言

在一个需要用到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. 23. 从零用Rust编写正反向代理,流控小姐姐的温柔一刀!

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现 ...

  2. notepad++中使用正则表达式处理数据

    如何使用正则表达式提取文本中的特定行? 以下是一个示例文本: [ INFO] HW RTC: 2023-05-15 07:21:00 [ INFO] HW RTC timestamp:16841352 ...

  3. Typora + PicGo 快乐书写 Markdown 文档

    声明 以下提及的图床服务商跟本人无任何商业来往,你可以根据自己的需要选择其他更适合的服务商. 个人观点 这是一个服务付费的时代,相比于自己折腾.在价格适当,服务到位的情况下,我更倾向于选择商业服务.毕 ...

  4. C/C++ extern “C“ 的问题

    声明 文章中的部分代码引用来在: https://blog.csdn.net/u012234115/article/details/43272441 场景 今天在CSDN中看到了一篇关于 extern ...

  5. 中龙技术 | HSCSEC CRY + MISC WP

    CRYPTO[HSC-1th] Easy SignIn 5445705857464579517A4A48546A4A455231645457464243566B5579556C7053546C4A4E ...

  6. GPTs破冰硅基文明社会

    GPTs破冰硅基文明社会 渐进是技术革命的常态 技术革命看似一夕之间就颠覆了世界,但实际上每项重大技术进步的背后,都经历了漫长的渐进积累.以蒸汽机为例,最初动力微弱.效率低下,需要大量工程师跟车维护, ...

  7. Python 之 Numpy 框架入门

    NumPy 目录 NumPy 基础使用 基本数据类型 创建基本数组 数组属性 数组生成 zeros.ones.empty 数组生成 numpy.zeros numpy.ones numpy.empty ...

  8. 如何利用Excel/WPS表格制作智能成绩查询系统?

    要利用Excel或WPS表格制作智能成绩查询系统,可以按照以下步骤进行: 1. 设计数据库结构:确定需要存储的学生信息和成绩数据,包括姓名.学号.科目.分数等字段. 2. 创建数据表:在Excel或W ...

  9. VM离线安装Centos 8以及配置

    一.安装 1.预装准备 1.1. 硬件准备 物理内存:2G以上(这里指系统搭建所需占用空间) 物理外存:20G(这里指系统搭建所需占用空间) 1.2. 环境搭建准备 Window10系统电脑一台.Vm ...

  10. IDEA编译器的永久试用设置与基本使用

    参考视频: 最通俗易懂的JDK.IDEA的安装使用权威指南 2023新版前端Web开发HTML5+CSS3+移动web视频教程,前端web入门首选黑马程序员 一.安装包下载与安装 官网下载地址 个人使 ...