今天使用click包时遇到个怪事,在command指令输入:
python main.py mnist mnist_LeNet ../log/mnist_test ../data --objective one-class --lr 0.0001 --n_epochs 150 --lr_milestone 50 --batch_size 200 --weight_decay 0.5e-6 --pretrain True --ae_lr 0.0001 --ae_n_epochs 150 --ae_lr_milestone 50 --ae_batch_size 200 --ae_weight_decay 0.5e-3 --normal_class 3
程序可以正常运行。
但是我想在pycharm中运行,在程序里面修改参数,无论怎么修改都会出错。
一开始我觉得只要把multiple那一行的type设置为tuple就行了,然而并没有什么用。
于是我就去看手册,发现click很多bug,于是就想着换argparse来管理参数。当我把参数都换成argparse后发现会遇到同样的问题。
于是我有点懵,后面捣鼓一下,发现那个type不是我们修改成了tuple,程序内部就会自动转换为tuple,它只对command指令中传进来的值会变为tuple,对于default值需要我们自己处理。
于是我写了个代码做举例:
argparse中的type和default可以不一致,但是在click中的type和default必须一致,否之就会报错:
对于click中的multiple为True来说:deault必须要求是list,否则报错。
那么如何使用argparse和clich时设置执行命令的时候自动输入单个tuple呢?有以下方法:
当使用的是argparse时:type不限,default直接输入(20,),
当使用的是click时:针对版本click8.1.3。
若multiple为True,type设置为int,default设置为[20,](multiple状态下输入必须为list)
若mulitiple为False(默认为False),type设置为tuple,default直接输入(20,)
如果发现有其他问题,建议自己写个代码看程序的输入输出,比较可靠。下面贴上我的测试代码
import click
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--epoch',type=tuple,default=(20,))
@click.command()
@click.option('--asd',type=int,default=[20],multiple = True,
help='Lr scheduler milestones at which lr is multiplied by 0.1. Can be multiple and must be increasing.')
def main(asd):
print(asd)
if __name__ == '__main__':
args = parser.parse_args()
epoch = args.epoch
print(epoch)
main()