2013-02-04 50 views
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']) 

反正是有我可以編輯打印功能的行數:

「你好,有世界」而不只是「你好世界」?

我想通過編輯功能在內存中完成這一切。我目前正在通過讀取源文件並編輯它來完成相同的效果,並將其寫入臨時文件,並導入臨時文件,但我想完全避免使用外部文件。

+1

爲什麼在這個世界上你想要這樣做? – XORcist

+1

自我修改程序在50年代左右死亡。你想要的是一個接受論證的函數。 – Bakuriu

+0

最終目標是什麼?可能有更好的方法來做到這一點。 – ninMonkey

回答

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 
+0

您的意思是function =''.join(lines)? 而且這將是有用的,但該函數現在是一個字符串。我需要它保持一個對象,因爲後面我需要從sys.modules ['function']引用它 – KaibutsuX

+0

'exec'執行字符串,即完整的函數定義。 –

0

你認爲的monkey patching而不是實際替換該代碼。

import func 

    func.function() 

    def monkey_boy(): 
     print "Monkey Boy" 

    func.function = monkey_boy 

    func.function() 

給出:

Hello 
World 
Monkey Boy 
+0

是的,我基本上是猴子補丁,但我不希望它現在執行。我想編輯/替換任何內容,以便稍後以相同的方式調用它 – KaibutsuX

0

你想帶參數的函數:

def function(greeting='Hello', target='World'): 
    print greeting, target 

在其他的文件:

function() #prints Hello World 

function(target='To The World') #prints Hello To The World 

如果你想要的東西,這不是,然後解釋什麼是使用案例因爲我非常確定您要創建一個巨大的設計缺陷,並按照您所描述的內容進行設計。

正如我在評論中指出的那樣,自修改程序在'40s /'50s中使用,但之後沒有。

相關問題