为了测试的目的,我可以在python中“伪造”一个包(或者至少是一个模块)吗?

2024-04-28 15:13:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用python伪造一个包。我想定义一些代码

from somefakepackage.morefakestuff import somethingfake

有些fakepackage是在代码中定义的,下面的所有东西也是。有可能吗?这样做的原因是欺骗我的unittest,我在python路径中得到了一个包(或者正如我在标题中所说的,一个模块),实际上这只是这个unittest的模型。

谢谢!


Tags: 模块代码from模型import路径标题定义
3条回答

当然。定义一个类,将所需的内容放入其中,将该类分配给sys.modules["classname"]

class fakemodule(object):

    @staticmethod
    def method(a, b):
        return a+b

import sys
sys.modules["package.module"] = fakemodule

也可以使用单独的模块(称为fakemodule.py):

import fakemodule, sys

sys.modules["package.module"] = fakemodule

你可以用一个类似于somethingfake的类来伪造它:

try:
    from somefakepackage.morefakestuff import somethingfake
except ImportError:
    class somethingfake(object):
         # define what you'd expect of somethingfake, e.g.:
         @staticmethod
         def somefunc():
             ...
         somefield = ...

是的,你可以制作一个假模块:

from types import ModuleType
m = ModuleType("fake_module")

import sys
sys.modules[m.__name__] = m

# some scripts may expect a file
# even though this file doesn't exist,
# it may be used by Python for in error messages or introspection.
m.__file__ = m.__name__ + ".py"

# Add a function
def my_function():
    return 10

m.my_function = my_function

注意,在这个例子中,它使用了一个实际的模块(of ModuleType),因为 Python代码可能需要模块(而不是虚拟类)。

这可以成为一个实用函数:

def new_module(name, doc=None):
    import sys
    from types import ModuleType
    m = ModuleType(name, doc)
    m.__file__ = name + '.py'
    sys.modules[name] = m
    return m

print(new_module("fake_module", doc="doc string"))

现在可以运行其他脚本:

import fake_module

相关问题 更多 >