gpt4 book ai didi

python - 解决 Python 包中的错误

转载 作者:太空狗 更新时间:2023-10-30 00:00:21 25 4
gpt4 key购买 nike

我最近遇到了以下问题:我正在用 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?我认为这很复杂而且很容易忘记(而且可能是非 pythonic 和丑陋的)。也许有一种方法可以自动“ Hook ”到包加载中并直接修改 scipy 模块,以便每个其他包只能看到修补后的包?我认为这个问题很常见,所以可能应该有一些“最佳实践”。

最佳答案

您可以对 scipy 模块进行“猴子修补”。在你的初始化代码的某处,做

import scipy.special
if scipy.version.version < "0.9.0":
scipy.special.btdtri = my_btdtri

由于模块只导入一次,因此只有一个模块 scipy.special,所有其他模块只会看到 monkey-patched 版本。

猴子补丁通常被认为对测试有用,但对生产代码没有用。不过,在这种情况下,我认为这很好,因为您并没有真正改变包的行为——您正在修复一个已确认的错误。

关于python - 解决 Python 包中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7952802/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com