Python 使用使用另一个库的修补版本和非修补版本的库

Python 使用使用另一个库的修补版本和非修补版本的库,python,import,monkeypatching,grequests,Python,Import,Monkeypatching,Grequests,我猜这个问题()的意思是,它有点有趣: 库A和B实际上是一个复杂的多处理库。(我听说)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,

我猜这个问题()的意思是,它有点有趣:

库A和B实际上是一个复杂的多处理库。(我听说)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()
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
结果(python3 my_program.py):

回溯(最近一次呼叫最后一次):
文件“my_program.py”,第3行,在
图书馆b.g()
文件“../test/libraryB.py”,第3行,g中
返回np.数组([1,2,3])
TypeError:f()接受0个位置参数,但给出了1个
问题:


libraryB应该使用numpy的非修补版本,但它使用的是修补版本,因此my_program.py中的libraryB.g()会中断。如何修复-此-?

没有两个单独的版本。模块在Python中是单例的,它们被加载一次
import
语句所做的就是绑定名称(第一个这样的语句触发加载)。只有经过修补的“版本”可用


解决这个问题的唯一方法是修补或替换修补库,以阻止它直接修补,并找到一种使该库工作的不同方法。这在很大程度上取决于修补库如何实现这一点


这是grequest仍然是一个非常专业的用例的原因之一;它修补了标准库,使得大量依赖标准库以某种方式工作的其他代码不兼容。如果你想将grequests和多处理结合起来,你很可能需要找到一种或另一种方法的替代方案。

没有两种不同的版本。模块在Python中是单例的,它们被加载一次
import
语句所做的就是绑定名称(第一个这样的语句触发加载)。只有经过修补的“版本”可用


解决这个问题的唯一方法是修补或替换修补库,以阻止它直接修补,并找到一种使该库工作的不同方法。这在很大程度上取决于修补库如何实现这一点


这是grequest仍然是一个非常专业的用例的原因之一;它修补了标准库,使得大量依赖标准库以某种方式工作的其他代码不兼容。如果你想将grequests和多处理结合起来,你很可能需要找到一种或另一种方法的替代方案。

没有两种不同的版本。在Python中,模块是单例的,它们只加载一次,
import
语句所做的就是绑定名称。只有经过修补的“版本”可用。解决此问题的唯一方法是修补修补库,以阻止它直接修补,并找到使该库工作的其他方法。是的。所以唯一的方法就是重写库A,使其从numpy继承,然后只修补继承的类?这听起来很有趣……修补库A可能是可能的,但这在很大程度上取决于他们对numpy做了什么以及如何使用修补版本。#编码恐怖没有两个独立的版本。在Python中,模块是单例的,它们只加载一次,
import
语句所做的就是绑定名称。只有经过修补的“版本”可用。解决此问题的唯一方法是修补修补库,以阻止它直接修补,并找到使该库工作的其他方法。是的。所以唯一的方法就是重写库A,使其从numpy继承,然后只修补继承的类?这听起来很有趣……修补库A是可能的,但这在很大程度上取决于他们对numpy做了什么以及如何使用修补版本