有没有办法在同一个python会话中以相同的名称,但在不同的范围内,在多线程环境中导入包两次?
我想导入包,然后覆盖它的一些函数,只有在特定的类中使用时才能改变它的行为。
例如,是否有可能实现这样的目标?
import mod
class MyClass:
mod = __import__('mod')
def __init__():
mod.function = new_function # override module function
def method():
mod.function() # call new_function
mod.function() # call original function
这可能看起来很奇怪,但在这种情况下,派生类的用户不必更改其代码以使用改进的包。
答案 0 :(得分:2)
将模块导入为副本:
def freshimport(name):
import sys, importlib
if name in sys.modules:
del sys.modules[name]
mod = importlib.import_module(name)
sys.modules[name] = mod
return mod
测试:
import mymodule as m1
m2 = freshimport('mymodule')
assert m1.func is not m2.func
注意强>:
importlib.reload
将无法完成这项工作,因为它始终"若有所思地"更新旧模块:
import importlib
import mymodule as m1
print(id(m1.func))
m2 = importlib.reload(m1)
print(id(m1.func))
print(id(m2.func))
示例输出:
139681606300944
139681606050680
139681606050680
答案 1 :(得分:1)
它看起来像是一个上下文管理器的工作
import modul
def newfunc():
print('newfunc')
class MyClass:
def __enter__(self):
self._f = modul.func
modul.func = newfunc
return self
def __exit__(self, type, value, tb):
modul.func = self._f
def method(self):
modul.func()
modul.func()
with MyClass() as obj:
obj.method()
modul.func()
modul.func()
输出
func
newfunc
newfunc
func
modul.py
包含
def func():
print('func')
注意:此解决方案仅适用于单线程应用程序(在OP中未指定)