如何在没有不必要依赖的情况下从 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.