2010-10-25 39 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])