python - "Replacing"具体函数调用

标签 python python-2.7 monkeypatching sage

这是一个关于Sage的问题,Sage基于Python 2.7。我已经写下了圣人问题here ,但会修改该问题以删除数学上下文。

我正在尝试针对非常特定的情况提高一些慢速函数的速度。 本质上,我有一个函数 foo,这样 foo(args) 传统上相当慢,但是由于我手动完成的分析, foo( args') 可以通过 bar(args') 轻松计算(对于在实践中易于检查的 args' 的特殊情况)。我想要一个新版本的 foo 这样:

  1. 如果args == args',(或args in A,其中A是包含所有输入的数据结构bar 是正确的)它只是调用 bar(args)
  2. 否则,它会调用 foo(args)

现在,如果 foo 只是在我自己的代码中定义,则修复起来很简单(通过修改定义或可能的装饰器)。

我的问题是 foo 位于 module1 (不是我的代码)中。 module2 也导入 foo ,并且我希望此更改对 module2 中的所有内容都可见(本质上,我自己从不调用 >foo,因此为了实现加速,我需要其他函数来更快地计算特定情况)。

我有自己的代码,可以导入 module1module2。有没有办法可以修改 foo (在我自己的代码中)以更快地处理这种特殊情况,以便当 module1module2 中的函数时> 称之为他们也会获得加速吗?仅当可以在不修改 module1module2 源代码的情况下这才真正有用。

编辑

根据下面的答案,是否有方法可以在 Sage 中对 PARI 调用进行猴子修补?我尝试进行猴子修补的方法被探查器描述为 {method '_nf_rnfeq' of 'sage.libs.cypari2.gen.gen' object}。 鉴于此,我尝试了以下方法,但没有成功。

import sage.libs.cypari2.gen
orig_nf_rnfeq = sage.libs.cypari2.gen.gen._nf_rnfeq
def _nf_rnfeq(*args, **kwargs):
    print("Rnfeq works!")
    return orig_nf_rnfeq(*args, **kwargs)

sage.libs.cypari2.gen.gen._nf_rnfeq = _nf_rnfeq

这会导致错误TypeError:无法设置内置/扩展类型'sage.libs.cypari2.gen.gen的属性

最佳答案

import module1
origfoo = module1.foo

def myfoo(*args):
    if args in A:
        return bar(*args)
    return origfoo(*args)

module1.foo = myfoo

在此之后导入module1的任何模块都将采用您修改后的函数版本。如果在您有机会应用补丁之前 module1 本身导入 module2,您可能会遇到问题。

关于python - "Replacing"具体函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47503061/

相关文章:

python - 将 PDF 电子表格数据提取到 Python 数据结构中

python - 有效地将长度为 n 的列表的 pandas 数据帧转换为 n 个数据帧

使用多个过滤器作为输入的 Python Plotly-Dash 应用程序

python - Monkey 修补导入此模块的模块

java - 如何对 jar 中的 .class 文件进行 monkeypatch

python - tkinter 使用 ID 设置焦点

python-2.7 - Python 2 元组/列表解包使用星抛出 SyntaxError

python - html2text : How to parse urls containing special characters?

python - 在 Python 中使用漂亮的汤在 html 页面上调用 "on click event"的问题

javascript - 当 angularjs 抛出错误时,如何使 TestCafe 测试失败?