如何编辑内存中加载的模块?
假设我有一个文件
# func.py:
def function():
print 'Hello'
print 'World'
还有另一个文件在同一个目录下
# load.py:
import sys
import inspect
from func import function
现在我可以通过以下方式访问这个函数的源代码:
code = inspect.getsourcelines(sys.modules['function'])
有没有办法让我修改这个函数的代码,让它打印:
"Hello There World" 而不是仅仅 "Hello World"?
我想在内存中直接修改这个函数,而不是先把源代码读出来,修改后再写到一个临时文件里,然后再导入这个临时文件。我希望能完全避免使用外部文件。
3 个回答
0
你想要一个带有参数的函数:
def function(greeting='Hello', target='World'):
print greeting, target
在另一个文件中:
function() #prints Hello World
function(target='To The World') #prints Hello To The World
如果这不是你想要的,那就解释一下你的使用场景,因为我很确定你这样做会造成一个巨大的设计缺陷。
正如我在评论中提到的,自我修改的程序在40年代和50年代被使用过,但之后就不再用了。
0
你是不是在考虑用猴子补丁的方式,而不是直接替换那段代码呢?
import func
func.function()
def monkey_boy():
print "Monkey Boy"
func.function = monkey_boy
func.function()
这样做会得到:
Hello
World
Monkey Boy
0
这段话的意思是,它并不是直接在原来的地方修改这个函数,而是用一个新的函数替换掉了这个模块里的旧函数,而且不需要使用临时文件(这样做可能已经足够了):
import inspect
import func
code = inspect.getsourcelines(func.function)
lines = code[0]
lines.insert(2," print 'There'\n")
exec ''.join(lines)
func.function = function