如何在没有不必要依赖的情况下从 python 模块导入实用程序函数?
How to import a utility function from a python module without unnecessary dependencies?
我需要使用存在于我无法控制的外部模块中的实用函数。该模块有许多我关心的特定功能未使用的导入。我不想安装那些不必要的依赖项(尤其是不想让我的包依赖项列表膨胀)。
它 doesn't seem possible 可以在没有导入的情况下使用函数。我想知道是否可以模拟模块?我曾短暂地希望这会起作用:
""" module_a """
import unused_module
def f():
return something_of_value
""" module_b: needs to use module_a.f() but doesn't have unused_module installed. """
import mock_module as unused_module
global unused_module
import module_a
module_a.f()
但我无法注入 unused_module
的模拟。有我可以在这里使用的解决方法吗?
这个呢?我们正在利用模块缓存系统,其中模块仅导入一次 并且 存储在 sys.modules
中,这是一个字典。
utili.py(我应该叫 module_a.py
)
""" module_a """
import unused_module
def f():
return "something_of_value"
然后是需要使用你的函数的客户端代码。
user.py
import sys
#we're not really doing anything here, just
#slotting in a fake entry into sys.modules
#so that it wont bother to "reimport" unused_modules
sys.modules["unused_module"] = 1
from utili import f
print(f"{f()=}")
执行user.py的输出:
python user.py
f()='something_of_value'
而且,需要说明的是,我在任何地方都没有实际的 unused_module
,因此如果先调用 utili.py
,导入将会失败。
py utili.py
Traceback (most recent call last):
File "/Users/myuser/explore/test_384_mockmo/utili.py", line 2, in <module>
import unused_module
ModuleNotFoundError: No module named 'unused_module'
如果任何代码试图使用 unused_module
,事情也不会顺利进行,因此您的 f
绝对不需要它的实际存在。对于在 utili.py
的模块加载时执行的任何代码也是如此。但是,您可以分配某种模拟而不是垃圾 1
.
我需要使用存在于我无法控制的外部模块中的实用函数。该模块有许多我关心的特定功能未使用的导入。我不想安装那些不必要的依赖项(尤其是不想让我的包依赖项列表膨胀)。
它 doesn't seem possible 可以在没有导入的情况下使用函数。我想知道是否可以模拟模块?我曾短暂地希望这会起作用:
""" module_a """
import unused_module
def f():
return something_of_value
""" module_b: needs to use module_a.f() but doesn't have unused_module installed. """
import mock_module as unused_module
global unused_module
import module_a
module_a.f()
但我无法注入 unused_module
的模拟。有我可以在这里使用的解决方法吗?
这个呢?我们正在利用模块缓存系统,其中模块仅导入一次 并且 存储在 sys.modules
中,这是一个字典。
utili.py(我应该叫 module_a.py
)
""" module_a """
import unused_module
def f():
return "something_of_value"
然后是需要使用你的函数的客户端代码。
user.py
import sys
#we're not really doing anything here, just
#slotting in a fake entry into sys.modules
#so that it wont bother to "reimport" unused_modules
sys.modules["unused_module"] = 1
from utili import f
print(f"{f()=}")
执行user.py的输出:
python user.py
f()='something_of_value'
而且,需要说明的是,我在任何地方都没有实际的 unused_module
,因此如果先调用 utili.py
,导入将会失败。
py utili.py
Traceback (most recent call last):
File "/Users/myuser/explore/test_384_mockmo/utili.py", line 2, in <module>
import unused_module
ModuleNotFoundError: No module named 'unused_module'
如果任何代码试图使用 unused_module
,事情也不会顺利进行,因此您的 f
绝对不需要它的实际存在。对于在 utili.py
的模块加载时执行的任何代码也是如此。但是,您可以分配某种模拟而不是垃圾 1
.