【发布时间】:2017-07-20 06:43:36
【问题描述】:
我猜这个问题 (Import not Working) 的意思如下,而且有点意思:
库 A 和 B 实际上是 grequest 和多处理。 (我听说)grequest 修补套接字,但多处理不能使用修补版本。
我想使用两个库 A 和 B。问题是库 A 内部导入了库 C 的修补版本,而库 B 内部导入了库 C 的未修补版本。
图书馆A.py:
import numpy as np
def f():
print("patched")
np.array = f
图书馆B.py:
import numpy as np
def g():
return np.array([1,2,3])
my_program.py:
import libraryA
import libraryB
libraryB.g()
结果(python3 my_program.py):
Traceback (most recent call last):
File "my_program.py", line 3, in <module>
libraryB.g()
File ".../test/libraryB.py", line 3, in g
return np.array([1,2,3])
TypeError: f() takes 0 positional arguments but 1 was given
问题:
libraryB 应该使用未打补丁的 numpy 版本,但它使用的是打补丁的版本,因此 my_program.py 中的 libraryB.g() 会中断。如何修复 -this- ?
【问题讨论】:
-
没有两个单独的版本。模块在 Python 中是单例的,它们被加载一次,
import语句所做的只是绑定名称。只有修补过的“版本”可用。 -
解决这个问题的唯一方法是修补补丁库以阻止它直接修补并找到使该库正常工作的不同方法。
-
是的。所以唯一的方法是重写库 A 以使其从 numpy 继承并修补继承的类?这听起来很有趣……
-
也许可以给库 A 打补丁,但这在很大程度上取决于他们对 numpy 做了什么以及他们如何使用打补丁的版本。
-
#编码恐怖
标签: python import monkeypatching grequests