在使用 argparse 解析 bool 参数时,需要设定 add_argument 的 action 参数为 'store_true' 或者 'store_false',而不是设定 type 参数为 bool,具体原因是,如果设定 type=bool,那么无论该参数传 True 还是 False,最后都只能得到 True。【这设定反人类】


命令行参数及 argparse 包

在我们需要控制不同分支代码的执行时,命令行参数最适用了,代码写好后只需在命令行设定不同的参数运行即可。

在命令行参数的解析中,可以用到 argparse 包。

入门 argparse 可以参考教程 https://docs.python.org/zh-cn/3.6/howto/argparse.html

给出一个最简单的 argparse 解析命令行参数的例子:(以下代码保存在 tmp.py 文件中)

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--seed',
 dest='seed', type=int, default=0)
args = parser.parse_args()
print(args)

通过在命令行执行python3 tmp.py --seed 1来改变 seed 参数的值,seed 参数的值可以通过args.seed获取。

argparse 解析 bool 参数错误做法

argparse 对 bool 类型数据的传递,和其它类型如 int、float、str 不一样,如下所示:

import argparse
parser = argparse.ArgumentParser()
# 这种写法是错的,结果不是你所想象的
parser.add_argument('--test',
 dest='test', type=bool, default=False)
args = parser.parse_args()

print(args)

如果我们在命令行执行python3 tmp.py --test Falsepython3 tmp.py --test True,我们会得到同样的结果,args.test 都会是 True。这有点反人类了。

argparse 解析 bool 参数正确做法 1

在传递 bool 值时,正确的做法是:

import argparse
parser = argparse.ArgumentParser()
# action 的取值可以是 'store_true'、'store_false',都是小写
parser.add_argument('--test',
 dest='test', action='store_true', default=False)
parser.parse_args()

print(args)

之后如果需要 test 参数为真,那么就在命令行执行python3 tmp.py --test,否则,就不要带上 test 参数,如python3 tmp.py

argparse 解析 bool 参数正确做法 2

import argparse


parser = argparse.ArgumentParser()

 parser.add_argument('--test',
 dest="test", action='store_true')

parser.add_argument('--no_test',
 dest="test", action='store_false')

parser.set_defaults(test=False)
 args = parser.parse_args()

print(args)

如果需要设置args.test为 True,那么执行python3 tmp.py --test;如果需要设置args.test为 False,执行 python3 tmp.py --no_test

References

Parsing boolean values with argparse - Stack Overflow

【python3基础】命令行参数及 argparse的更多相关文章

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

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

  2. python命令行参数解析模块argparse和docopt

    http://blog.csdn.net/pipisorry/article/details/53046471 还有其他两个模块实现这一功能,getopt(等同于C语言中的getopt())和弃用的o ...

  3. Python命令行参数解析模块argparse

    当写一个Python脚本时经常会遇到不同参数不同功能的情况,如何做一个更好看的命令帮助信息以及对命令参数解析呢? 这就需要使用argparse模块 #!/usr/bin/env python # -* ...

  4. python 命令行参数——argparse模块的使用

    以下内容主要来自:http://wiki.jikexueyuan.com/project/explore-python/Standard-Modules/argparse.html argparse ...

  5. python3获得命令行输入的参数

    外部直接执行python文件时,我们有时需要获得命令行的参数   获得命令行参数的两种方式   1.通过sys.argv sys.argv:获得一个参数列表,第一个值为文件名本身,通过sys.argv ...

  6. Python3 命令行参数

    Python 提供了 getopt 模块来获取命令行参数. $ python test.py arg1 arg2 arg3 Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: ...

  7. $命令行参数解析模块argparse的用法

    argparse是python内置的命令行参数解析模块,可以用来为程序配置功能丰富的命令行参数,方便使用,本文总结一下其基本用法. 测试脚本 把以下脚本存在argtest.py文件中: # codin ...

  8. 【NS-3学习】ns3-模拟基础:关键概念,日志,命令行参数

    前言 本篇博客先介绍在仿真过程中会使用到的一些关键概念,然后介绍便于调试仿真脚本的常用技术:日志.命令行参数. 关键概念 节点 在因特网术语中,主机(终端)是指任何一台连接到网络的计算设备.ns-3并 ...

  9. C基础知识(14):命令行参数

    命令行参数是使用main()函数参数来处理的,其中,argc是指传入参数的个数,argv[]是一个指针数组,指向传递给程序的每个参数. 应当指出的是,argv[0]存储程序的名称,argv[1]是一个 ...

随机推荐

  1. Scala 学习笔记之函数(1)

    class Student { val mySayHello1: String => Unit = sayHello val mySayHello2: (String, Int) => U ...

  2. 快学Scala 第七课 (类构造函数)

    类 主构造器: class Person (var name: String){ } 主构造参数可以不带val或者var,如果没有被其他方法使用,则不保存为字段. 如果被其他方法使用,则被升格为字段, ...

  3. Django学习之model进阶

    一 QuerySet 可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句.   >>> Entry.objects.al ...

  4. opencv之膨胀与腐蚀

    腐蚀和膨胀 Erosion/Dilation erosion/dilation,用白话说,就是让图像亮的区域收缩和扩张. 原理 我们定义一个卷积核矩阵.这个矩阵可以是任何形状的,但通常而言,是矩形或者 ...

  5. 解决window.onload延迟加载问题

    window.onload方法,表示当页面所有的元素都加载完毕,并且所有要请求的资源也加载完毕才触发执行function这个匿名函数里边的具体内容.这样肯定保证了代码在domReady之后执行.使用w ...

  6. Java的IO操作之关闭流

    我们知道,当结束对一个流的操作时,需要调用流的close()方法对其进行释放,这将释放掉与这个流有关的所有资源,包括文件句柄.端口等.如果不关闭流,垃圾回收机制将无法识别你是否已使用完这个文件,读取的 ...

  7. HeidiSQL、Navicat、mysql命令和source命令导入sql脚本的速度比较

    一.四种导入方式的比较 1.heidisql客户端是一条一条插入的,速度最慢,而且很脆弱比较容易崩溃: 2.mysql命令导入380万记录用时1小时13分(属于前台运行的命令,ctrl+c就可以结束) ...

  8. 机器学习回顾篇(7):决策树算法(ID3、C4.5)

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  9. Ubuntu 查看已安装软件

    apt list --installed dpkg -l

  10. 渗透测试-基于白名单执行payload--Cmstp

    0x01 Cmstp简介 Cmstp安装或删除“连接管理器”服务配置文件.如果不含可选参数的情况下使用,则 cmstp 会使用对应于操作系统和用户的权限的默认设置来安装服务配置文件. 微软官方文档: ...