Search code examples
pythonclassdefinition

How to display definition of a class in Python


I was going through this question : How do I return the definition of a class in python?

But I am unable to display the class definition. I am getting the below error:

>>> class A:
...     pass
...
>>> import inspect
>>> source_text = inspect.getsource(A)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\**\Python\Python36\lib\inspect.py", line 968, in getsource
    lines, lnum = getsourcelines(object)
  File "C:\Users\**\Python\Python36\lib\inspect.py", line 955, in getsourcelines
    lines, lnum = findsource(object)
  File "C:\Users\**\Python\Python36\lib\inspect.py", line 768, in findsource
    file = getsourcefile(object)
  File "C:\Users\**\Python\Python36\lib\inspect.py", line 684, in getsourcefile
    filename = getfile(object)
  File "C:\Users\**\Python\Python36\lib\inspect.py", line 654, in getfile
    raise TypeError('{!r} is a built-in class'.format(object))
TypeError: <module '__main__' (<_frozen_importlib_external.SourceFileLoader object at 0x0000026A79293F60>)> is a built-in class
>>>

Can someone please advise what am I doing wrong here? Thanks.


Solution

  • The inspect.getsource() function only works if there is a text file available to load the source code.

    You typed the definition of the class into the interactive interpreter, which doesn't keep the original source around when compiling that source into in-memory class and code objects.

    Put your class definition into a module, import the module, and then use inspect.getsource().

    inspect.getsource() works by first finding the module for a given object (for classes, by looking at the ClassObj.__module__ attribute for the module name, then getting the module via sys.modules[modulename]) then seeing if the module has a __file__ attribute from which a readable source file can be determined. If there is such a filename and it can be read, then the inspect module reads that file to then search for the class ClassName: line and giving you all lines from that point on with same or deeper indentation. The interactive interpreter executes everything in the __main__ module and there is no __file__ attribute for the interpreter, so any attempts at loading source code for objects defined there will simply fail.

    If you just wanted to know what members the class defines, use dir() or help() on the object instead. You don't need to see the full source code for that information.