使用Python中的检查无法获取源代码的方法“申报”通过EXEC(Can't get

2019-09-21 11:39发布

下面的代码会抛出一个异常:

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)

有一个很好的理由让我做这样的事情。

对此有一个解决方法吗? 是否有可能做这样的事情? 如果不是,为什么?

Answer 1:

我只是看着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



Answer 2:

这甚至是不可能的。 Python在去它运行时加载的源代码文件的任何代码的源代码 - 在磁盘上。 它通过查看定位该文件__file__代码的模块属性。

用于产生一个代码对象波谷“EXEC”或“编译”的字符串不被从这些调用引起的对象周围保持。

你也许可以让看代码,如果你设置了__file__上生成的代码的全局字典变量,源字符串写入该文件,调用之前inspect.getsource



文章来源: Can't get source code for a method “declared” through exec using inspect in Python