python之argparse传递bool值

前言

在一个需要用到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中的布尔类型 #### 布尔类型的定义 在Python中,`bool`是一个基本的数据类型,专门用来表示逻辑上的真(`True`)或假(`False`). 这种数据类型主要用于逻辑判断以及条件控制结构之中[^3]. #### 创建布尔的方法 可以通过多种方式来创建布尔对象。最直接的方式就是通过关键字 `True` 和 `False`. 另外,也可以利用内置函数 `bool()` 来基于其他表达式的求结果生成布尔. ```python a = True # 直接赋为True b = False # 直接赋为False c = bool(1) # 调用bool(), 将整数1转成对应的布尔True d = bool("")# 空字符串被转换成了False print(a,b,c,d) ``` #### 不同数据类型的真假性 得注意的是,在Python里并非只有显式声明的`True`/`False`才是布尔型;实际上任何数、序列(如列表、元组)、映射(字典)甚至自定义类实例都可以隐含地转化为布尔参与逻辑运算.具体来说: - 所有非零数字和非空容器均会被视作`True`. - 零 (`0`, `0.0`), 空串 (`""` 或者 `''`), 空集合 (例如:`[]`,`{}`),以及其他一些特殊情况下返回的对象则对应于`False`. 这表明当这些实体出现在需要布尔上下文中时会自动按上述规则进行转化[^4]. #### 应用于条件语句和其他场景 由于其本质属性决定了`bool`非常适合做决策分支依据,所以在诸如`if...elif...else`这样的流程控制结构里面经常能看到它的身影; 同样地,在while循环里的测试条件也离不开它. 此外,还可以与其他操作符组合起来实现更复杂的逻辑关系处理,比如: ```python x = 5 y = 8 result = x > y and not(x==7 or y<9) print(result) # 输出应为False因为第一个子表达式已经失败了所以不再继续评估后面的or部分 ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值