python argparse传入布尔参数不生效解决
前言
在一个需要用到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传入布尔参数不生效解决的更多相关文章
- python argparse命令行参数
测试: 第一个没有任何输出和出错 第二个测试为打印帮助信息,argparse会自动生成帮助文档 第三个测试为未定义的-v参数,会出错 第四个测试为未定义的参数foo,出错 positional arg ...
- python argparse:命令行参数解析详解
简介 本文介绍的是argparse模块的基本使用方法,尤其详细介绍add_argument内建方法各个参数的使用及其效果. 本文翻译自argparse的官方说明,并加上一些笔者的理解 import a ...
- python解析传入的命令行参数 argv
python解析命令行参数主要有三种方法:sys.argv.argparse解析.getopt解析 方法一:sys.argv —— 命令行执行:python test_命令行传参.py 1,2,3 1 ...
- Python argparse参数管理学习笔记1
1.前言 最近尝试学习使用argparse进行参数管理,顺便改善一下我那丝毫都不专业的.简单粗暴的代码习惯. argparse模块可以让人轻松地编写用户友好地命令行接口,并且还能够自动生成帮助与使用手 ...
- 解决使用Mybatis 传入多参数使用map封装遇到的 “坑”问题
好久没来写些东西了,今天 我分享一下自己遇到的一个“小 坑”,这也许对您来说不是个问题,但是我还是希望对没有遇到过这类问题的朋友给个小小的帮助吧 是这样的,需求:需要实现根据多条件 且分页展示数据 1 ...
- python 从外部获取传入的参数
有时候我们在执行python程序的时需要接收到外部传入的参数 python的 sys.argv[]就能实现 # test.py import sys #引入模块 str = sys.argv[1]pr ...
- python函数传入参数(默认参数、可变长度参数、关键字参数)
1.python中默认缺省参数----定义默认参数要牢记一点:默认参数必须指向不变对象! 1 def foo(a,b=1): 2 print a,b 3 4 foo(2) #2 1 5 foo(3,1 ...
- Python的命令行参数(argparse)
参考:https://www.cnblogs.com/lindaxin/p/7975697.html 参考:https://www.cnblogs.com/dengtou/p/8413609.html ...
- Python MySQLdb中执行SQL语句传入的参数应该要加上引号如果该字段是str类型的
如下图: username在表中是字符串类型的,所以传入的参数要加上引号
- (转) argparse — 解析命令参数和选项
原文地址:https://pythoncaff.com/docs/pymotw/argparse-command-line-option-and-argument-parsing/166 https: ...
随机推荐
- Codeforces Round #693 (Div. 3) A~E 题解
写在前边 链接:Codeforces Round #693 (Div. 3) 没有打,闲的没事补一下题. A. Cards for Friends 链接:A题链接 题目大意: 给定一张\(w*h\)的 ...
- java-EasyExcel模板导出
前言: 需求:根据自定义模板导出Excel,包含图片.表格,采用EasyExcel 提示:EasyExcel请使用 3.0 以上版本, 对图片操作最重要的类就是 WriteCellData<V ...
- 开发环境搭建:CubeMX、Keil MDK-ARM、仿真器驱动程序
来源:成电<微机原理与嵌入式系统>漆强 第三章 STM32微控制器开发环境的搭建 一.STM32 CubeMX的安装 1.STM32 CubeMX的下载和安装 先安装java环境安装 下载 ...
- MCube动态化与原生工程结合最佳实践
跨端动态化开发方案重要性日益凸显,本文对我们团队MCube动态化实践做了总结,为大家提供经验和借鉴. 接入背景 随着我们工程的需求迭代,暴露出了业务需求量大,分端开发和发版更新成本高等痛点,使用H5页 ...
- 本地部署modelscope-agent
本地部署modelscope-agent 部署流程 在modelscope社区创建一个自己的空间(假设name是LocalAgent),clone空间到本地(或云服务器如魔搭Notebook) git ...
- mybits_基础
1.框架:一款半成品软件,我们可以基于框架继续开发,从而完成一些个性化的需求 2.ORM:对象关系映射,数据和实体对象的映射 3.MyBatis:是一个优秀的基于Java的持久层框架,它内部封装了JD ...
- 一款开源免费美观的WinForm UI控件库 - ReaLTaiizor
前言 今天推荐一款基于MIT license开源.免费.美观的.NET WinForm UI控件库:ReaLTaiizor. 什么是WinForm? WinForm是一个传统的桌面应用程序框架,它基于 ...
- 一行代码修复100vh bug | 京东云技术团队
你知道奇怪的移动视口错误(也称为100vh bug)吗?或者如何以正确的方式创建全屏块? 一.100vh bug 什么是移动视口错误? 你是否曾经在网页上创建过全屏元素?只需添加一行 CSS 并不难: ...
- 性能测试常见面试题(Loadrunner)
https://blog.csdn.net/xiangxiupp/article/details/53862056
- kubernetes安装(一)
参考: https://www.cnblogs.com/liuyangQAQ/p/17299871.html 部署组件包 名称 安装包 kubeadm集群组件 kubelet-1.20.9 kubea ...