“替换”特定函数调用

时间:2017-11-27 02:13:06

标签: python python-2.7 monkeypatching sage

这是一个关于Sage的问题,它基于Python 2.7。我已经写了圣训问题here,但会修改这个问题以删除数学背景。

我正在尝试为特定情况提高一些慢速功能的速度。 从本质上讲,我有一个函数foo,因此传统上foo(args)很慢,但是由于我手工完成的分析,foo(args')可以通过{{1}轻松计算(对于bar(args')的特殊情况,在实践中很容易检查)。我希望有args'的新版本:

  1. 如果foo,(或args == args',其中args in A是包含所有输入A的某些数据结构是正确的),则只需调用bar < / LI>
  2. 否则,它会调用bar(args)
  3. 现在,如果foo(args)刚刚在我自己的代码中定义,那么修复(通过修改定义或可能是装饰器)这将是微不足道的。

    我的问题是foo位于foo(不是我的代码)。 module1也导入module2,我希望此更改对foo中的所有内容都可见(实质上,我自己从不调用module2,所以对于加速到foo发生我需要其他功能来更快地计算特定情况。)

    我有自己的代码导入module1module2。有没有办法可以修改foo(从我自己的代码中)来更快地处理这个特殊情况,这样当module1module2中的函数调用它时它们将获得加速还有?只有在不修改module1module2的源代码的情况下,这才有用。

    修改

    根据下面的答案,有没有办法在Sage中对PARI进行猴子补丁?我试图猴子补丁的方法由探查器描述为{method '_nf_rnfeq' of 'sage.libs.cypari2.gen.gen' objects}。 鉴于此,我尝试了以下,但没有奏效。

    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: can't set attributes of built-in/extension type 'sage.libs.cypari2.gen.gen

1 个答案:

答案 0 :(得分:1)

import module1
origfoo = module1.foo

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

module1.foo = myfoo

在此之后导入module1的任何模块都将获取该功能的修改版本。如果module1本身在您有机会应用修补程序之前导入module2,则可能会出现问题。