Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't get source code for a method "declared" through exec using inspect in Python

The following code throws an exception:

import inspect

def work():
    my_function_code = """def print_hello():
                              print('Hi!')
                       """
    exec(my_function_code, globals())
    inspect.getsource(print_hello)

The code above throws an exception IOError. If I declare the function without using exec (like below), I can get its source code just fine.

import inspect

def work():
    def print_hello():
        print('Hi!')
    inspect.getsource(print_hello)

There's a good reason for me to do something like this.

Is there a workaround for this? Is it possible to do something like this? If not, why?

like image 859
mmtauqir Avatar asked Aug 22 '12 11:08

mmtauqir


1 Answers

I just looked at the inspect.py file after reading @jsbueno's answer, here's what I found :

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()

It clearly indicates that it tries to open the source file and then reads its content, which is why it is not possible in case of exec.

like image 110
Ashwini Chaudhary Avatar answered Sep 20 '22 17:09

Ashwini Chaudhary