下面的代码会抛出一个异常:
import inspect
def work():
my_function_code = """def print_hello():
print('Hi!')
"""
exec(my_function_code, globals())
inspect.getsource(print_hello)
上面的代码抛出异常IOError异常。 如果我宣布的功能,而无需使用EXEC(如下图所示),我可以得到它的源代码就好了。
import inspect
def work():
def print_hello():
print('Hi!')
inspect.getsource(print_hello)
有一个很好的理由让我做这样的事情。
对此有一个解决方法吗? 是否有可能做这样的事情? 如果不是,为什么?
我只是看着inspect.py文件读取@ jsbueno的回答后,这里是我的发现:
def findsource(object):
"""Return the entire source file and starting line number for an object.
The argument may be a module, class, method, function, traceback, frame,
or code object. The source code is returned as a list of all the lines
in the file and the line number indexes a line in that list. An **IOError
is raised if the source code cannot be retrieved.**"""
try:
file = open(getsourcefile(object))
except (TypeError, IOError):
raise IOError, 'could not get source code'
lines = file.readlines() #reads the file
file.close()
这清楚地表明,它试图打开源文件,然后读取它的内容,这就是为什么它是不可能的情况下exec
。
这甚至是不可能的。 Python在去它运行时加载的源代码文件的任何代码的源代码 - 在磁盘上。 它通过查看定位该文件__file__
代码的模块属性。
用于产生一个代码对象波谷“EXEC”或“编译”的字符串不被从这些调用引起的对象周围保持。
你也许可以让看代码,如果你设置了__file__
上生成的代码的全局字典变量,源字符串写入该文件,调用之前inspect.getsource
。
文章来源: Can't get source code for a method “declared” through exec using inspect in Python