翼度科技»论坛 编程开发 python 查看内容

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

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
在一个需要用到flag作为信号控制代码中一些代码片段是否运行的,比如"--flag True"或者"--flag False"。
但是古怪的是无法传入False,无论传入True还是False,程序里面都是True的参数,所以这个flag并没有生效,也就失去了意义。
参考代码:
  1. import argparse
  2. def test_bool():
  3.     parser = argparse.ArgumentParser(description="This code is used to test bool value.")
  4.     parser.add_argument("--flag",
  5.                         type=bool,
  6.                         default=True)
  7.     args = parser.parse_args()
  8.     print("# The type of flag: ", type(args.flag))
  9.     print(args.flag is False)
  10.     if args.flag:
  11.         print(f"# Flag: {True}")
  12.     else:
  13.         print(f"# Flag: {False}")
  14. if __name__ == '__main__':
  15.     test_bool()
复制代码
执行上面的代码:python3 test.py --flag False
按照执行的期望是输出# Flag: False,但是实际输出的结果是True:
  1. (data_parse)  ~/Desktop/code/cython&numba  python3 test.py --flag False
  2. # The type of flag:  <class 'bool'>
  3. False
  4. # Flag: True
复制代码
为什么会出现这种情况呢?因为,在命令行的输入会被python认为是字符串,并不是布尔类型。
解决方式一【推荐】

更改代码为:
  1. # ***
  2. parser.add_argument("--flag",
  3.                         action="store_true",
  4.                         help="Run or not.")
  5. # ***
复制代码
这样的话,当你不输入--flag的时候,默认为False;输入--flag的时候,才会触发True值。
看执行结果:
  1. (data_parse)  ~/Desktop/code/cython&numba  python3 test.py
  2. # The type of flag:  <class 'bool'>
  3. True
  4. # Flag: False
  5. (data_parse)  ~/Desktop/code/cython&numba  python3 test.py --flag
  6. # The type of flag:  <class 'bool'>
  7. False
  8. # Flag: True
复制代码
当然这种方式,你也可以指定action为store_false,不输入的时候--flag默认True,输入--flag触发False。
解决方式二

这种方式稍微复杂一些,就是需要自己去写一个函数对输入的字符串值进行一个转换,由字符串转换为布尔值。
代码:
  1. import argparse
  2. def str2bool(v):
  3.     if isinstance(v, bool):
  4.         return v
  5.     if v.lower() in ('yes', 'true', 't', 'y', '1'):
  6.         return True
  7.     elif v.lower() in ('no', 'false', 'f', 'n', '0'):
  8.         return False
  9.     else:
  10.         raise argparse.ArgumentTypeError('Boolean value expected.')
  11. def test_bool():
  12.     parser = argparse.ArgumentParser(description="This code is used to test bool value.")
  13.     parser.add_argument("--flag",
  14.                         type=str2bool,
  15.                         default=True,
  16.                         help="Run or not.")
  17.     args = parser.parse_args()
  18.     print("# The type of flag: ", type(args.flag))
  19.     print(args.flag is False)
  20.     if args.flag:
  21.         print(f"# Flag: {True}")
  22.     else:
  23.         print(f"# Flag: {False}")
  24. if __name__ == '__main__':
  25.     test_bool()
复制代码
这样的话,当我们只要输入自定义函数中的那些对应TrueorFalse的选项,就能能触发对应的布尔类型。
看执行情况:
  1. (data_parse)  ~/Desktop/code/cython&numba  python3 test.py         
  2. # The type of flag:  <class 'bool'>
  3. False
  4. # Flag: True
  5. (data_parse)  ~/Desktop/code/cython&numba  python3 test.py --flag True
  6. # The type of flag:  <class 'bool'>
  7. False
  8. # Flag: True
  9. (data_parse)  ~/Desktop/code/cython&numba  python3 test.py --flag False
  10. # The type of flag:  <class 'bool'>
  11. True
  12. # Flag: False
  13. (data_parse)  ~/Desktop/code/cython&numba  python3 test.py --flag 0   
  14. # The type of flag:  <class 'bool'>
  15. True
  16. # Flag: False
  17. (data_parse)  ~/Desktop/code/cython&numba  python3 test.py --flag 1
  18. # The type of flag:  <class 'bool'>
  19. False
  20. # Flag: True
复制代码
由于默认了default的值为True,所以不输入--flag的时候就默认为True,然后输入--flag对应自定义func: str2bool()中的选项时,就能达到想要的开关效果。

来源:https://www.cnblogs.com/python1111/p/17625034.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具