0

假设我有一个文件

# 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”?

我想通过就地编辑函数来在内存中完成这一切。我目前正在通过读取源代码并在将其写入临时文件并导入临时文件时对其进行编辑来实现相同的效果,但我想完全避免使用外部文件。

4

3 回答 3

0

您是否想到猴子修补而不是实际替换该代码。

  import func

  func.function()

  def monkey_boy():
      print "Monkey Boy"

  func.function = monkey_boy

  func.function()

给出:

Hello
World
Monkey Boy
于 2013-02-04T17:18:33.297 回答
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 年代被使用,但在那之后就没有了。

于 2013-02-04T19:05:56.943 回答
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
于 2013-02-04T16:43:28.663 回答