繁体   English   中英

在 Python 中使用可选导入进行测试

[英]Testing with Optional Import in Python

我有一个可以使用两个模块的库; 一个速度很快,但仅在 Linux 和 macOS 上可用,另一个速度较慢,但​​它是多平台的。 我的解决方案是使库与两者兼容并具有如下内容:

try:
    import fastmodule
except ImportError:
    import slowmodule

现在我想比较使用任一模块时库的时间。 在安装了两个模块的环境中,是否有任何方法可以在不更改源代码(即在 Jupyter Notebook 中)的情况下屏蔽fastmodule ,以便使用slowmodule

这是一个小技巧,但它是这样的:
您可以编写自己的导入器并注册它(请注意,这是 Python 3 特有的,Python 2 对此有另一个 API):

import sut
import functools
import importlib
import sys


def use_slow(f):
    @functools.wraps(f)
    def wrapped(*args, **kwargs):
        ImportRaiser.use_slow = True
        if 'fastmodule' in sys.modules:
            del sys.modules['fastmodule']  # otherwise it will remain cached
        importlib.reload(sut)
        f(*args, **kwargs)

    return wrapped


def use_fast(f):
    @functools.wraps(f)
    def wrapped(*args, **kwargs):
        ImportRaiser.use_slow = False
        importlib.reload(sut)
        f(*args, **kwargs)

    return wrapped


class ImportRaiser:
    use_slow = False

    def find_spec(self, fullname, path, target=None):
        if fullname == 'fastmodule':
            if self.use_slow:
                raise ImportError()


sys.meta_path.insert(0, ImportRaiser())

@use_fast
def test_fast():
    # test code


@use_slow
def test_slow():
    # test code

在这里, sut是您要测试的模块,您必须重新加载它才能更改行为。 我添加了装饰器以提高可读性,但这当然可以通过某些功能或在测试设置中完成。

如果您使用慢速版本, fastmodule将在导入时引发ImportError ,而将使用slowmodule 在“快速”的情况下,一切照常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM