2009-04-22 72 views
9

的重複..Python的反思 - 我可以用它來獲取方法定義的源代碼


我有一個成功的方法定義完全運行,但想在運行時修改它。

爲如: 如果我有一個方法

def sayHello(): 
    print "Hello" 

型(sayHello的)給我的答案 '類型的函數'。我能否獲得此函數對象的源代碼字符串?這是否被視爲安全問題?

+3

你不能做到這一點。重複:http://stackoverflow.com/questions/427453/how-can-i-get-the-code-of-python-function; http://stackoverflow.com/questions/334851/print-the-code-which-defined-a-lambda-function; http://stackoverflow.com/questions/399991/python-how-do-you-get-python-to-write-down-the-code-of-a-function-it-has-in-memo – 2009-04-22 14:10:58

+0

它是Python :你已經有了源。 – 2009-04-22 14:12:10

+3

我強烈建議詢問另一個問題以獲取更多詳細信息。我有最有趣的感覺,你真正想做的事情可能只需要關閉/裝飾器,但是因爲你問的所有問題都是打印源代碼(並試圖修改它),你會得到令人失望的答案。 – 2009-04-22 14:15:49

回答

2

sayHello.func_code.co_code返回一個字符串,我認爲它包含該方法的編譯代碼。由於Python在內部將代碼編譯爲虛擬機字節碼,所以這可能就剩下了。

可以拆卸的,雖然:

import dis 

def sayHello(): 
    print "hello" 

dis.dis(sayHello) 

此打印:

 
    1   0 LOAD_CONST    1 ('hello') 
       3 PRINT_ITEM 
       4 PRINT_NEWLINE 
       5 LOAD_CONST    0 (None) 
       8 RETURN_VALUE 

看一看Decompyle的去編譯器。

0

沒有內置函數來獲取函數的源代碼,但是,如果您有權訪問源代碼(它將位於您的Python/lib目錄中),則可以構建自己的函數。

17

使用檢查模塊:

import inspect 
import mymodule 
print inspect.getsource(mymodule.sayHello) 

該功能必須在你導入一個模塊中進行定義。

相關問題