【问题标题】:Making tqdm and the like functions accept different types of parameters in PythonPython中让tqdm之类的函数接受不同类型的参数
【发布时间】:2020-09-25 22:05:50
【问题描述】:

这不是 tqdm 特有的,而是关于在 Python 中将参数传递给函数的一般问题。我想实现以下功能,而不必在 tqdm 下复制整个块。任何帮助将不胜感激。

if flag == True:
    with tqdm(dataloader, total=args.num_train_batches) as pbar:
else:
    with tqdm(dataloader) as pbar:

更具体地说,我可以这样传递参数吗?

if flag == True:
    tqdm_args = dataloader, total=args.num_train_batches
else:
    tqdm_args = dataloader
with tqdm(tqdm_args) as pbar:

【问题讨论】:

    标签: python parameter-passing tqdm


    【解决方案1】:

    这实际上相当简单,因为他们似乎在制作 Python 时就想到了这一点。您可以使用 Python 的 ternary operator 来执行此操作,将上面的内容压缩为一行:

    with tqdm(dataloader, total=args.num_train_batches if flag else None) as pbar:
      # ...
    

    编辑:用您提到的首选方法回答,是的。这也是可能的。如果您将这些参数放入一个列表(或字典,如果您有关键字 args),然后在调用函数时在列表名称前面放置一个 *(或字典的 **),它会将列表解压缩为一组参数。

    使用列表的示例:

    if flag: # if flag is a boolean, putting "== True" does nothing
        tqdm_args = [dataloader, None, args.num_train_batches]
    else:
        tqdm_args = [dataloader]
    with tqdm(*tqdm_args) as pbar:
        # ...
    

    字典示例:

    if flag:
      tqdm_kwargs = {"iterable": dataloader, "total": args.num_train_batches}
    else:
      tqdm_kwargs = {"iterable": dataloader}
    with tqdm(**tqdm_kwargs) as pbar:
      # ...
    

    很高兴能提供帮助!

    【讨论】:

    • 第一个有效,但第二个在 total=args.num_train_batches 处抛出错误
    • 哦,对了。对不起。我会补救的。发生这种情况是因为关键字 args 与常规 args 不同——它们需要使用 dict 传递。
    • @kkgarg 好的,我修好了。现在每个代码块都应该可以工作了。他们每个人都有自己最好的用例 imo,但我自己最常使用三元运算符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    相关资源
    最近更新 更多