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

Mag*_*nus 23 python

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

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

kin*_*all 31

您所谈论的内容称为依赖注入,被认为是使您的代码可测试的好习惯.我不认为有任何关于Python会使它成为unPythonic或不好的做法.

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

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

但是,传递对您希望使用的模块的引用更灵活,更好地分离关注点,并且不会比将引用传递给您希望使用的类或实例(或字符串或整数)更接近Pythonic.

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

class Foo(object):
    def __init__(self, module=None):
        if not module:
            import module
        self.module = module
Run Code Online (Sandbox Code Playgroud)


小智 5

我比赛迟到了,但我刚刚学会了一种方法并想分享:

chosen_config='moduleName' #string, relative path. example: 'configurations.local.logistic'. You would take this from input, or the command line, or something like that
import importlib
config=importlib.import_module(chosen_config,package='myPackage')
#...do stuff...
data=pd.read_csv(config.dataFile)
#...more stuff...
save(config.outputFile)
Run Code Online (Sandbox Code Playgroud)

相当于:

import moduleName as config
Run Code Online (Sandbox Code Playgroud)

但我让用户(又名 Future Me 或我信任的人)决定导入哪个模块。

用例(我的情况):您想要使用一系列不同的设置来运行一系列实验,这些设置将影响多个脚本。您已将每个实验的设置存储在专用的配置文件中。您希望在不修改代码的情况下运行所有​​任务。