Как отобразить определение класса в Python - PullRequest
0 голосов
/ 06 сентября 2018

У меня был вопрос: Как мне вернуть определение класса в python?

Но я не могу отобразить определение класса. Я получаю следующую ошибку:

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

Может кто-нибудь пожалуйста посоветовать, что я тут не так делаю? Спасибо.

1 Ответ

0 голосов
/ 06 сентября 2018

Функция inspect.getsource() работает только при наличии текстового файла для загрузки исходного кода .

Вы ввели определение класса в интерактивный интерпретатор, который не сохраняет исходный источник при компиляции этого источника в класс памяти и объекты кода.

Поместите определение вашего класса в модуль, импортируйте модуль, и затем используйте inspect.getsource().

inspect.getsource() работает, сначала находя модуль для данного объекта (для классов, просматривая атрибут ClassObj.__module__ для имени модуля, затем получая модуль через sys.modules[modulename]), затем проверяя, есть ли у модуля __file__ атрибут, по которому можно определить читаемый исходный файл. Если такое имя файла существует и его можно прочитать, то модуль inspect читает этот файл, чтобы затем искать строку class ClassName: и выдавать вам все строки с этой точки с одинаковыми или более глубокими отступами. Интерактивный интерпретатор выполняет все в модуле __main__, и для интерпретатора нет атрибута __file__, поэтому любые попытки загрузки исходного кода для определенных там объектов просто потерпят неудачу.

Если вы просто хотите узнать, какие члены определяет класс, используйте вместо этого dir() или help() на объекте. Вам не нужно видеть полный исходный код для этой информации.

...