Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In Python is there a way to get the code object of top level code?

Is it possible to get the code object of top level code within a module? For example, if you have a python file like this:

myvar = 1
print('hello from top level')

def myfunction():
    print('hello from function')

and you want to access the code object for myfunction, then you can use myfunction.__code__. For example, myfunction.__code__.co_consts will contain the string 'hello from function' etc...

Is there a way to get the code object for the top level code? That is, for the code:

myvar = 1

print('hello from top level')

I would like something like __main__.__code__.co_consts that will contain 'hello from top level', but I cannot find any way to get this. Does such a thing exist?

like image 936
Martin Payne Avatar asked Dec 04 '25 13:12

Martin Payne


1 Answers

The code that is executed at the top level of a module is not directly accessible as a code object in the same way that functions' code objects are, because the top-level code is executed immediately when the module is imported or run, and it doesn't exist as a separate entity like a function does.

But when Python runs a script, it compiles it first to bytecode and stores it in a code object. The top-level code (__main__ module), have a code object, but it is not directly exposed, so you need to use inspect module to dig deeper:

import inspect

def get_top_level_code_object():
    frame = inspect.currentframe()

    # Go back to the top-level frame
    while frame.f_back:
        frame = frame.f_back

    # The code object is stored in f_code
    return frame.f_code

if __name__ == "__main__":
    top_level_code_obj = get_top_level_code_object()
    print(top_level_code_obj.co_consts) 

would yield

(0, None, <code object get_top_level_code_object at 0x7f970ad658f0, file "/tmp/test.py", line 3>, '__main__')
like image 52
Marcin Orlowski Avatar answered Dec 06 '25 05:12

Marcin Orlowski



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!