不是从文件加载python模块

smu*_*ins 3 python import unit-testing module

我在库中有一些python代码试图从一个模块中加载一个简单的值,该模块将存在于使用该库的应用程序中

from somemodule import simplevalue
Run Code Online (Sandbox Code Playgroud)

通常,使用该库的应用程序将具有模块文件,一切正常.但是,在此库的单元测试中,模块不存在.我知道我可以创建一个临时文件并在运行时将该文件添加到我的路径中,但我很好奇是否有一种方法可以在python中将某些内容加载到内存中以允许上述导入工作.

这更像是一种好奇心,说"将模块添加到测试路径"是没有用的:P

Tho*_*s K 7

它是.使用types.ModuleType创建一个新的模块对象,然后将其添加到sys.modules:

sys.modules["somename"] = types.ModuleType("somename")
Run Code Online (Sandbox Code Playgroud)

然后你可以做import somename.如果需要向其中添加类或函数,请在调用测试脚本之前导入它,然后只需向其中添加函数:

def myfunc(x, y, z):
    ...

somename.myfunc = myfunc
Run Code Online (Sandbox Code Playgroud)

不言而喻,但以防万一:这在很大程度上是学术上的好奇心.它有一些用于测试的用途,但除此之外,坚持以通常的方式导入东西.

顺便说一下,我怎么知道这个:我遇到了测试中使用的技术_winreg,为非Windows系统上的模块制作"存根" .在这里它正在使用中.


kin*_*all 5

没有必要创建一个模块.没有Python代码关心是否somemodule.simplevalue实际上是对模块属性的引用.为此,程序需要检查类型somemodule.何必?

由于您只需要模块中的单个值并将其导入您自己的命名空间,因此只需定义它:

simplevalue = 42
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以try/except先尝试导入真实模块.

try:
    from somemodule import simplevalue
except ImportError:
    simplevalue = 42
Run Code Online (Sandbox Code Playgroud)

如果要导入整个模块但只使用一个值,则可以使用类来定义命名空间.

try:
    import somemodule
except ImportError:
    class somemodule(object):
        simplevalue = 42
Run Code Online (Sandbox Code Playgroud)

现在somemodule.simplevalue指的是值,无论模块是否可用.

如果您希望其他模块也可以导入somemodule以查看伪造的类模块,就像在单元测试中那样,之后只需执行此操作:

import sys
sys.modules["somemodule"] = somemodule
Run Code Online (Sandbox Code Playgroud)