【问题标题】:Using libraries that use patched and non-patched version of another library使用使用另一个库的修补和非修补版本的库
【发布时间】: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


【解决方案1】:

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

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

这是 grequest 仍然是一个非常专业的用例的原因之一;它对标准库打了补丁,使得大量依赖标准库以某种方式工作的其他代码不兼容。如果您希望将 grequests 和多处理结合起来,则更有可能必须为其中一种方法寻找替代方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多