argparse 或者 click中出现‘int‘ object is not iterable

今天使用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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
"'int' object is not iterable" 这个错误意味着你试图对一个整数对象进行迭代操作,但整数对象是不可迭代的。 解决这个问题的方法是使用range()函数来迭代整数。range()函数可以生成一个整数序列,从而可以进行迭代操作。例如,可以使用for循环来迭代一个整数x: for i in range(x): # 迭代操作 这样就可以避免 "'int' object is not iterable" 的错误。 在你的情况下,你可能需要查看代码的第三行,看看是否有对整数对象进行了迭代操作。如果有的话,你需要使用range()函数来代替。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python 运行报错-‘intobject is not iterable(‘int‘对象不可迭代)](https://blog.csdn.net/piupiu78/article/details/120354293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python开发时报TypeError ‘intobject is not iterable解决方式](https://blog.csdn.net/Bejpse/article/details/125241151)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值