编写代码时使用tqdm,但如果没有安装tqdm,则无缝地避免使用它。

3
我想写一个使用tqdm来显示进度条的Python代码,但如果没有安装tqdm,我的代码应该能够正常运行,而不会使用tqdm的进度条,也不会引发ImportError异常;
例如,当安装了tqdm时,它应该像这样运行:
from tqdm import tqdm

def my_code(items):
    for item in tqdm(items, unit='item'):
        print(item)

..当tqdm不可用时,它应该像这样表现:
def my_code(items):
    for item in items:
        print(item)

我该怎么做呢?

我尝试过只是将导入行包起来:

try:
    from tqdm import tqdm
except ImportError:
    pass

..但这并没有阻止一个 NameError 在 "for item in tqdm" 行出现。 我也可以用 try catch 来包裹那一行.. 但那只会让它看起来丑陋 :(
def my_code(items):
    try:
        tqdm_wrapper_if_exists = tqdm(items, unit='item')
    except NameError:
        tqdm_wrapper_if_exists = items
    for item in tqdm_wrapper_if_exists:
        print(item)

我想要一个能够在导入错误附近完成的操作,并且让其余的代码无需适应即可无缝运行的解决方案。
我也看过创建一个已安装模块的直通通道以实现可选导入,但问题本身假设需要创建一个新的tqdm.py文件并将其添加到系统路径中...这使得我试图避免的“丑陋”变得更加明显 :) 此外,那里讨论的解决方案无法在导入语句之后无缝编写代码,因为你需要复制你的tqdm.py文件并将其添加到你的路径中。我正在寻找一个更加简洁的解决方案。

你只是用tqdm来显示进度条,还是会使用像tqdm.write(…)或者tqdm.reset(…)这样的功能? - undefined
只需在可迭代对象上使用tqdm的装饰器(而不使用其它任何方法,如write和reset)即可。 - undefined
1
那么你下面的答案应该没问题,我会将iter重命名为iterable,因为前者是一个内置函数。 - undefined
我也会的 :) 我在下面更新了我的回答。谢谢。 - undefined
1个回答

4
这里有一个简单的解决方案:
try:
    from tqdm import tqdm
except ImportError:
    def tqdm(iterable, **kwargs):
        return iterable

这样可以让任何代码在可用时使用tqdm,或者在不可用时跳过tqdm。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接