python argparse传入布尔参数不生效的解决方法

这篇具有很好参考价值的文章主要介绍了python argparse传入布尔参数不生效的解决方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在一个需要用到flag作为信号控制代码中一些代码片段是否运行的,比如"--flag True"或者"--flag False"。
但是古怪的是无法传入False,无论传入True还是False,程序里面都是True的参数,所以这个flag并没有生效,也就失去了意义。

参考代码:

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()中的选项时,就能达到想要的开关效果。文章来源地址https://www.toymoban.com/news/detail-642702.html

到了这里,关于python argparse传入布尔参数不生效的解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包