【发布时间】:2011-12-18 15:54:58
【问题描述】:
我最近遇到了以下问题:我正在用 Python 开发一个数值库(称为 spuq),其核心需要 scipy。现在 scipy 中的一个函数,称为btdtri,对于某些输入参数元组有一个错误。然而,根据 scipy 的开发人员的说法,这个错误现在已在 scipy 0.9 版中得到修复。所以在我的代码中我有这样的东西:
import scipy
def foo(a, b, c):
if scipy.__version__>=(0, 9):
return btdtri(a, b, c)
else:
return my_fixed_btdtri(a, b, c)
这可行,但是,我真的不喜欢在我的代码中乱扔第三方软件包的错误修复。我宁愿将它包含在一个模块中,实现解决方法,并让我的所有其他模块自动使用修补模块。
现在我的问题是:一般而言,处理此类案件的最佳做法是什么?例如。写我自己的spuq.contrib.scipy 并说在那里
from scipy import *
if __version__ < (0, 9):
btdtri = my_fixed_btdtri
而不是到处导入scipy 导入spuq.contrib.scipy?我认为这很复杂,很容易忘记(而且可能是不合常规和丑陋的)。也许有一种方法可以自动“挂钩”到包加载并直接修改scipy 模块,以便其他每个包只看到修补过的包?我认为这个问题很常见,所以可能应该有一些“最佳实践”。
【问题讨论】: