Python - '导入'或传递模块作为参数?

时间:2012-03-13 17:51:33

标签: python

我想知道将模块对象传递给需要它的类或对象而不是使用import可能不是一个坏主意,因为它避免了对这些模块的硬依赖。

我想知道是否有人更了解Python Zen而不是我可以解释为什么这是一个可怕/不可怕的想法?

2 个答案:

答案 0 :(得分:29)

您所谈论的内容称为dependency injection,并且被视为使您的代码可测试的良好做法。我不认为有任何关于Python会使它成为unPythonic或不好的做法。

您可以通过其他方式在Python中执行此操作,例如根据您传入的某种标记导入不同的模块:

class Foo(object):
    def __init__(self, testing=False):
        if testing:
            import module_test as module
        else:
            import module
        self.module = module

但是传递对你想要使用的模块的引用更灵活,更好地区分关注点,并且不比Pythonic传递对你想要使用的类或实例(或字符串或整数)的引用。

对于普通(非测试)用例,您可以使用默认参数值:

class Foo(object):
    def __init__(self, module=None):
        if not module:
            import module
        self.module = module

答案 1 :(得分:4)

如果有问题的类可以使用几个不同模块中的一个,那么传入你想要它使用的模块是有意义的。

在我到目前为止遇到的每种情况中,所需的模块都是确定的,因此首选使用import