Выбрать главу

>>> def f(x, y=0):

...  """Function f(x, y)"""

...  global s

...  return t + x + y

...

>>> f.secure = 1     # присваивается дополнительный атрибут

>>> f.func_name      # имя

'f'

>>> f.func_doc       # строка документации

'Function f(x, y)'

>>> f.func_defaults  # значения по умолчанию

(0,)

>>> f.func_dict      # словарь атрибутов функции

{'secure': 1}

>>> co = f.func_code # кодовый объект

>>> co

<code object f at 0x401ec7e0, file "<stdin>", line 1>

Кодовые объекты имеют свои атрибуты:

>>> co.co_code # байт-код

't\x00\x00|\x00\x00\x17|\x01\x00\x17Sd\x01\x00S'

>>> co.co_argcount # число аргументов

2

>>> co.co_varnames # имена переменных

('x', 'y')

>>> co.co_consts   # константы

(None,)

>>> co.co_names    # локальные имена

('t', 'x', 'y')

>>> co.co_name     # имя блока кода (в нашем случае - имя функции)

'f'

и так далее. Более правильно использовать для получения всех этих сведений модуль inspect.

Модуль inspect

Основное назначение модуля inspect — давать приложению информацию о модулях, классах, функциях, трассировочных объектах, фреймах исполнения и кодовых объектах. Именно модуль inspect позволяет заглянуть «на кухню» интерпретатора Python.

Модуль имеет функции для проверки принадлежности объектов различным типам, с которыми он работает:

Функция Проверяемый тип
inspect.isbuiltin Встроенная функция
inspect.isclass Класс
inspect.iscode Код
inspect.isdatadescriptor Описатель данных
inspect.isframe Фрейм
inspect.isfunction Функция
inspect.ismethod Метод
inspect.ismethoddescriptor Описатель метода
inspect.ismodule Модуль
inspect.isroutine Функция или метод
inspect.istraceback Трассировочный объект

Пример:

>>> import inspect

>>> inspect.isbuiltin(len)

True

>>> inspect.isroutine(lambda x: x+1)

True

>>> inspect.ismethod(''.split)

False

>>> inspect.isroutine(''.split)

True

>>> inspect.isbuiltin(''.split)

True

Объект типа модуль появляется в Python–программе благодаря операции импорта. Для получения информации о модуле имеются некоторые функции, а объект–модуль обладает определенными атрибутами, как продемонстрировано ниже:

>>> import inspect

>>> inspect.ismodule(inspect)

True

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

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