在python中如何使用argparse更好地传入布尔值

在python中,通过命令行传入参数可以使用标准库argparse实现。它的基本用法读者可以参考官网说明,我在这里主要想说明一下如何使用argparse来传入布尔值。

1、问题复现

一开始,我的方案是这样的:

# scripy.py
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--debug', default=False, type=bool)
args = parser.parse_args()

if __name__ == '__main__':
    print('type of debug:', type(args.debug))
    print(args.debug)

按照我的设想,可以通过python scripy.py --debug=True来指定debug的值为True;如果不设置,那么该参数默认就是False

一般来说,在使用上述代码时不会遇到什么问题,结果也是按照设想进行输出的。然而,这其实是存在一个严重的缺陷的。

为了说明这个缺陷,我先将程序修改一下:

...
parser.add_argument('--debug', default=True, type=bool)
...

即,将debug的默认值改成了True。那么,按照原先的设想:如果在命令行指定--debug=False,那么参数值就应该是False,如果不指定,则默认是True

但事实并非如此:

(base) [root@localhost ~]# python tmp.py --debug=False
type of debug: <class 'bool'>
True

读者会发现,即使指定了--debug=False,但实际上的值仍为True

这是为什么呢?

2、原因分析

要搞清楚这个问题的原因,就需要知道argparse在处理参数时的逻辑了:它首先会把所传入的参数看成是字符串,然后如果指定了type,则调用type对应的对象对字符串进行处理

按照这个逻辑,在执行python tmp.py --debug=False时出现上述结果就不难理解了:

  • 首先,debug的值是一个字符串'False'而不是内置关键词False
  • 然后,调用了bool对象来尝试将'False'转换为布尔值。

想必读者可以猜到了,字符串'False'既然是一个非空字符串,那么bool('False')的返回值当然就是True了。

3、解决方案

想要解决这个问题,需要用到action这个参数。

将代码修改如下:

...
parser.add_argument('--debug', action='store_true')
...

从字面意思来理解,action的意思是说在接收到参数后的操作,store_true则是指,如果在命令行显式地指定了对应的参数,则该参数值就为True,否则就是False

所以,在调用的时候,--debug后面就不能再跟参数值了:

(base) [root@localhost ~]# python tmp.py 
type of debug: <class 'bool'>
False
(base) [root@localhost ~]# python tmp.py --debug
type of debug: <class 'bool'>
True

参考:
https://docs.python.org/3/library/argparse.html#type

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芳樽里的歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值