如何在内存中编辑加载的模块?

时间:2013-02-04 16:34:01

标签: python reflection python-2.x

假设我有一个文件

# 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 :(得分: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

答案 1 :(得分:0)

您是否考虑monkey patching而不是实际替换该代码。

  import func

  func.function()

  def monkey_boy():
      print "Monkey Boy"

  func.function = monkey_boy

  func.function()

给出:

Hello
World
Monkey Boy

答案 2 :(得分: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年代使用,但之后却没有使用。