使TQM等函数在Python中接受不同类型的参数

使TQM等函数在Python中接受不同类型的参数,python,parameter-passing,tqdm,Python,Parameter Passing,Tqdm,这不是TQM特有的,而是关于在Python中向函数传递参数的一般问题。我希望实现以下功能,而不必在TQM下复制整个块。任何帮助都将不胜感激 if flag == True: with tqdm(dataloader, total=args.num_train_batches) as pbar: else: with tqdm(dataloader) as pbar: 更具体地说,我可以这样传递参数吗 if flag == True: tqdm_args = datalo

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

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时似乎想到了这一点。您可以使用Python实现这一点,将上面的内容压缩到一行:

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\u train\u batchesh处抛出错误,对吧。很抱歉我会补救的。之所以会这样,是因为关键字arg与常规arg不同,它们需要使用dict传递。@kkgarg好的,我修复了它。每个代码块现在都应该可以工作了。在我看来,它们都有自己的最佳用例,但我自己最常使用三元运算符。