python命令行参数解析:使argparse命令行参数正确识别bool的四种解决办法

  1. 最常见的做法是当使用这个命令行参数的时候,获得的值为True,否则即为False,比如:

    parser.add_argument('--bais', '-B',  default=False,action='store_true', help='是否启用GRU的偏置向量')
    

    当加入-B的时候,parser.parse_args().bais为True,如果不加入-B,则parser.parse_args().bais为默认值,即False

  2. 另外一个做法,使用两个命令行参数,并且其中一个参数使用dest来映射到同一个属性上,如:

    # 注意,第一个定义"has_bias"的default决定了其默认值
    parser.add_argument('--no_bais', '-N',  default=False,action='store_false', dest="has_bias",help='是否启用GRU的偏置向量')
    parser.add_argument('--has_bais', '-T',  default=False,action='store_true', dest="has_bias",help='是否启用GRU的偏置向量')
    # 当然也可以是用set_defaults来改变默认值
    parser.set_defaults(has_bias=True)
    

    当什么参数不使用的时候,parser.parse_args().has_baisTrue;如果注释掉parser.set_defaults(has_bias=True),那parser.parse_args().has_baisFalse

    当加入--has_baisparser.parse_args().has_baisTrue;当加入--no_baisparser.parse_args().has_baisFalse

    这个方法有一个bug,就是,可以同时使用两个参数,--has_bais --no_bais,这时候,parser.parse_args().has_bais以最后一个参数值为准了。这时候,必须再程序里判断这两个参数是否互斥,并且,规定一下当同时存在时的行为。

  3. 自定义type函数,如:

    def str2bool(v):
        '''
        这里基本上是会被识别为str类型的,所以isinstance没啥用
        :param v:
        :return:
        '''
        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.')
            
    parser.add_argument('--Dais', '-D',  type=str2bool, help='是否启用GRU的偏置向量')
    

    这个参数支持’yes’, ‘true’, ‘t’, ‘y’, ‘1’代表True;支持’no’, ‘false’, ‘f’, ‘n’, '0’代表False。这个参数没有指定parser.parse_args().Dais为None,而不会报错。

  4. 自定义type函数,但是用内置的distutils.util来简化函数定义过程:

    import distutils.util as util
    parser.add_argument('--utils_bais', type=lambda x:bool(util.strtobool(x)),help='是否启用GRU的偏置向量')
    

    实现的效果跟3一样。

测试的两个脚本:

  • demo.py:

    import os
    
    script_path="target_script.py"
    
    
    if __name__ == '__main__':
        os.system(f"python {script_path} -M 1 2 -U 3  --has_bais --no_bais ")
    
  • target_script.py

    import datetime
    import argparse
    import distutils.util as util
    import os
    
    
    def str2bool(v):
        '''
        这里基本上是会被识别为str类型的
        :param v:
        :return:
        '''
        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.')
    
    parser = argparse.ArgumentParser()
    
    parser.add_argument('--bais', '-B',  default=False,action='store_true', help='是否启用GRU的偏置向量')
    # 注意,第一个定义"has_bias"的default决定了其默认值
    parser.add_argument('--no_bais', '-N',  default=False,action='store_false', dest="has_bias",help='是否启用GRU的偏置向量')
    parser.add_argument('--has_bais', '-T',  default=False,action='store_true', dest="has_bias",help='是否启用GRU的偏置向量')
    # 当然也可以是用set_defaults来改变默认值
    parser.set_defaults(has_bias=True)
    parser.add_argument('--Dais', '-D',  type=str2bool, help='是否启用GRU的偏置向量')
    parser.add_argument('--utils_bais', type=lambda x:bool(util.strtobool(x)),help='是否启用GRU的偏置向量')
    
    results = parser.parse_args()
    print(os.getcwd())
    print(f"{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    print(f"results.units:{results.bais}")
    print(f"results.has_bias:{results.has_bias}")
    print(f"results.Dais:{results.Dais}")
    print(f"results.utils_bais:{results.utils_bais}")
    
    if __name__ == '__main__':
        pass
    
    

    demo.py定义好传递的参数,然后运行`target_script.py

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

月司

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

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

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

打赏作者

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

抵扣说明:

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

余额充值