gpt4 book ai didi

python - 如何创建一个返回另一个模块的 python 模块

转载 作者:太空宇宙 更新时间:2023-11-03 13:55:54 25 4
gpt4 key购买 nike

我正在尝试制作 python 模块,该模块在导入时的行为与另一个模块完全一样。

python>
import foo
import fake_foo

help(foo) == help(fake_foo)

我需要这个,因为我需要在我的 fake_foo 模块中添加一些额外的代码 mafic 代码,它从另一个位置动态加载真实模块。

如果不清楚,下面的代码不会因为明显的原因而不起作用:load_source 确实返回模块,但它不能告诉 python 将它加载到当前模块。

# fake_foo/__init__.py

import imp
imp.load_source('foo', '/path/to/foo')

一个非常重要的要求是我无法控制人们如何导入 fake_foo,我无法修改执行导入的代码,我需要在假模块中完成整个实现。

附言。我将需要可以与 py27、py35+ 一起工作的代码,这很有可能这将需要不同的逻辑,但一旦我让它适用于一个版本,就应该不难找到适用于其他版本的类似方法。

最佳答案

这实际上是微不足道的。只需替换 sys.modules

在 shim 模块中:

# mod1.py
import sys
import mod2

sys.modules["mod1"] = mod2

在实际模块中:

# mod2.py
var = 'hello'

演示:

>>> import mod1
>>> mod1
<module 'mod2' from 'mod2.py'>
>>> mod1.var
'potato'

这可能看起来很 hacky,但它是 Python 中的一个特性 - 导入机制故意允许这样的技巧。

This works because the import machinery is actively enabling this hack, and as its final step pulls the actual module out of sys.modules, after loading it. (This is no accident. The hack was proposed long ago and we decided we liked enough to support it in the import machinery.)

来自 GvR:https://mail.python.org/pipermail/python-ideas/2012-May/014969.html

关于python - 如何创建一个返回另一个模块的 python 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55667501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com