所以我可以通过深入研究ipython源代码部分地解决这个问题。它利用了内置模块
linecache
,它包含从文件读取源代码和缓存结果的函数。这个
inspect
和
traceback
模块都使用此模块来获取函数的源。
解决方法是以与问题中相同的方式创建函数,但是使用
compile
使用组合的唯一文件名:
source = 'def foo(x, y):' + '\n\t' + 'return x / y'
filename = '<dynamic-123456>' # Angle brackets may be required?
code = compile(source, filename, 'exec')
g = {numpy: numpy, ...} # Modules and such required for function
l = {}
exec(src, g, l)
func = l['foo']
linecache
包含变量
cache
它是一个字典,将文件名映射到
(size, mtime, lines, fullname)
元组。您只需为假文件名添加一个条目:
lines = [line + '\n' for line in source.splitlines()]
import linecache
linecache.cache[filename] = (len(source), None, lines, filename)
然后函数将与
inspect.getsource()
IPython的
?
/
??
语法,在ipython回溯中。然而,它在内置的回溯中似乎仍然不起作用。这对我来说已经足够了,因为我几乎总是在伊普顿工作。
编辑:关于如何在内置解释器中使用回溯打印,请参见下面的user2357112注释。