-
最常见的做法是当使用这个命令行参数的时候,获得的值为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 -
另外一个做法,使用两个命令行参数,并且其中一个参数使用
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_bais
为True
;如果注释掉parser.set_defaults(has_bias=True)
,那parser.parse_args().has_bais
为False
。当加入
--has_bais
,parser.parse_args().has_bais
为True
;当加入--no_bais
,parser.parse_args().has_bais
为False
。这个方法有一个bug,就是,可以同时使用两个参数,
--has_bais --no_bais
,这时候,parser.parse_args().has_bais
以最后一个参数值为准了。这时候,必须再程序里判断这两个参数是否互斥,并且,规定一下当同时存在时的行为。 -
自定义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,而不会报错。 -
自定义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