Читать «Язык программирования Python» онлайн - страница 151

Роман Авриевич Сузи

('inspect', '.pyc', 'rb', 2)

>>> inspect.getmodulename('/usr/local/lib/python2.3/inspect.pyc')

'inspect'

>>> inspect.__name__

'inspect'

>>> inspect.__dict__

...

>>> inspect.__doc__

...Get useful information from live Python objects.\n\nThis module encapsulates

....

Интересны некоторые функции, которые предоставляют информацию об исходном коде объектов:

>>> import inspect

>>> inspect.getsourcefile(inspect)   # имя файла исходного кода

'/usr/local/lib/python2.3/inspect.py'

>>> inspect.getabsfile(inspect)      # абсолютный путь к файлу

'/usr/local/lib/python2.3/inspect.py'

>>> print inspect.getfile(inspect)   # файл кода модуля

/usr/local/lib/python2.3/inspect.pyc

>>> print inspect.getsource(inspect) # исходный текст модуля (в виде строки)

# -*- coding: iso–8859–1 -*- ""...Get useful information from live Python objects.

...

>>> import smtplib

>>> # Комментарий непосредственно перед определением объекта:

>>> inspect.getcomments(smtplib.SMTPException)

'# Exception classes used by this module.\n'

>>> # Теперь берем строку документирования:

>>> inspect.getdoc(smtplib.SMTPException)

'Base class for all exceptions raised by this module.'

С помощью модуля inspect можно узнать состав аргументов некоторой функции с помощью функции inspect.getargspec():

>>> import inspect

>>> def f(x, y=1, z=2):

... return x + y + z

...

>>> def g(x, *v, **z):

... return x

...

>>> print inspect.getargspec(f)

(['x', 'y', 'z'], None, None, (1, 2))

>>> print inspect.getargspec(g)

(['x'], 'v', 'z', None)

Возвращаемый кортеж содержит список аргументов (кроме специальных), затем следуют имена аргументов для списка позиционных аргументов (*) и списка именованных аргументов (**), после чего — список значений по умолчанию для последних позиционных аргументов. Первый аргумент–список может содержать вложенные списки, отражая структуру аргументов:

>>> def f((x1,y1), (x2,y2)):

... return 1

...

>>> print inspect.getargspec(f)

([['x1', 'y1'], ['x2', 'y2']], None, None, None)

Классы (как вы помните) — тоже объекты, и о них можно кое–что узнать:

>>> import smtplib

>>> s = smtplib.SMTP

>>> s.__module__ # модуль, в котором был определен объект

'smtplib'

>>> inspect.getmodule(s) # можно догадаться о происхождении объекта

<module 'smtplib' from '/usr/local/lib/python2.3/smtplib.pyc'>

Для визуализации дерева классов может быть полезна функция inspect.getclasstree(). Она возвращает иерархически выстроенный в соответствии с наследованием список вложенных списков классов, указанных в списке–параметре. В следующем примере на основе списка всех встроенных классов–исключений создается дерево их зависимостей по наследованию:

import inspect, exceptions

def formattree(tree, level=0):

 """Вывод дерева наследований.

 tree — дерево, подготовленное с помощью inspect.getclasstree(),