2010-10-25 42 views
13

假設我在Python shell中工作,並且我得到一個函數f。我如何訪問包含其源代碼的字符串? (從shell,而不是通過手動打開代碼文件。)查看Python函數的代碼

我希望這工作,即使在其他函數內定義的lambda函數。

+0

複製所有這些的:http://stackoverflow.com/search?q=%5Bpython%5D+view+來源 – 2010-10-25 13:36:55

回答

9

inspect.getsource
看起來getsource不能得到lambda的源代碼。

+0

是的,不幸的是,只有它可以打開源代碼存在的文件纔有效。你可以做的一件事是看看lambda正在做什麼,使用dis來分離字節碼。 – dcolish 2010-11-01 16:45:17

0

函數對象只包含編譯的字節碼,源文本不保留。檢索源代碼的唯一方法是讀取它來自的腳本文件。

沒有什麼特別之處,雖然lambda表達式:他們仍然有f.func_code.co_firstlineco_filename屬性,它可以用來檢索源文件,只要拉姆達是在一個文件中定義的,而不是交互式輸入。

+0

函數的編譯字節碼可以用'dis.dis'查看。 – adw 2010-10-25 16:29:49

8

不一定是你在找什麼,但在ipython你可以這樣做:

>>> function_name?? 

,你會得到該函數的代碼源(只有當它在一個文件中)。所以這對lambda不起作用。但它絕對有用!

3

也許這能幫助(也可以得到拉姆達但它是非常簡單),

import linecache 

def get_source(f): 

    source = [] 
    first_line_num = f.func_code.co_firstlineno 
    source_file = f.func_code.co_filename 
    source.append(linecache.getline(source_file, first_line_num)) 

    source.append(linecache.getline(source_file, first_line_num + 1)) 
    i = 2 

    # Here i just look until i don't find any indentation (simple processing). 
    while source[-1].startswith(' '): 
     source.append(linecache.getline(source_file, first_line_num + i)) 
     i += 1 

    return "\n".join(source[:-1])