首次执行后用内置替换自身的函数

时间:2016-01-05 22:26:14

标签: python python-3.x

是否可以编写一个在首次执行后替换自身的函数?

first.py:

from second import max
x = max(1,2,3)
y = max(4,5,6)

second.py:

def max(*args):
    ... #rewire references
    return min(args)

我是否可以拨打max第二次拨打内置电话,而第一次拨打来自 second.py 的电话?我尝试修改globals() dict,但这没有任何效果,当然,也没有在自定义global max函数中声明max,即使重命名(后来再次命名为max)。

这有可能吗?我可以通过某种方式访问​​导入模块吗?

(在有人提出不可避免的评论之前:我知道这是一个坏主意,我不打算在生产中使用它,如果可能的话。我只是想知道它是否可行。 )

编辑:为了澄清,之后这应该是它在REPL中的样子:

>>> from second import *
>>> max
<function max at 0x10e501400>
>>> x = max(1,2,3)
>>> max
<built-in function max>

1 个答案:

答案 0 :(得分:1)

在文件maxtest.py中:

import __builtin__

_max = __builtin__.max
def max(*args):
    print "Inside non standard max function"
    __builtin__.max = _max
    return min(args)

__builtin__.max = max    

在文件maxtest2.py中:

import maxtest

x = max(1, 2, 3)
y = max(4, 5, 6)

运行python maxtest2.py会产生:

Inside non standard max function

请注意,输出仅发生一次,表示第二次调用已更改最大功能。