【发布时间】:2010-10-25 12:56:39
【问题描述】:
假设我在 Python shell 中工作,我得到了一个函数 f。如何访问包含其源代码的字符串? (从 shell,而不是通过手动打开代码文件。)
我希望它甚至适用于在其他函数中定义的 lambda 函数。
【问题讨论】:
标签: python introspection
假设我在 Python shell 中工作,我得到了一个函数 f。如何访问包含其源代码的字符串? (从 shell,而不是通过手动打开代码文件。)
我希望它甚至适用于在其他函数中定义的 lambda 函数。
【问题讨论】:
标签: python introspection
inspect.getsource
看来getsource无法获取lambda的源代码。
【讨论】:
【讨论】:
也许这会有所帮助(也可以获得 lambda,但它非常简单),
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])
【讨论】:
函数对象只包含编译后的字节码,不保留源文本。检索源代码的唯一方法是读取它来自的脚本文件。
不过 lambda 并没有什么特别之处:它们仍然有一个 f.func_code.co_firstline 和 co_filename 属性,您可以使用它们来检索源文件,只要 lambda 是在文件中定义的而不是交互式输入。
【讨论】:
dis.dis查看。