Чтение онлайн

на главную - закладки

Жанры

Язык программирования Python
Шрифт:

.…

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

Листинг

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

которое представлено списком вложенных списков и кортежей.

В кортеже entry первый элемент — класс, а второй — кортеж с его

базовыми классами. Иначе entry — вложенный

список.

level — уровень отступов

«""

for entry in tree:

if type(entry) is type:

c, bases = entry

print level * " ", c.__name__, \

«(" + ", ".join([b.__name__ for b in bases]) + ")»

elif type(entry) is type([]):

formattree(entry, level+1)

v = exceptions.__dict__.values

exc_list = [e for e in v

if inspect.isclass(e) and issubclass(e, Exception)]

formattree(inspect.getclasstree(exc_list))

С помощью функции inspect.currentframe можно получить текущий фрейм исполнения. Атрибуты фрейма исполнения дают информацию о блоке кода, исполняющегося в точке вызова метода. При вызове функции (и в некоторых других ситуациях) на стек кладется соответствующий этому фрейму блок кода. При возврате из функции текущим становится фрейм, хранившийся в стеке. Фрейм содержит контекст выполнения кода: пространства имен и некоторые другие данные. Получить эти данные можно через атрибуты фреймового объекта:

Листинг

import inspect

def f:

fr = inspect.currentframe

for a in dir(fr):

if a[:2] != "__":

print a, ":", str(getattr(fr, a))[:70]

f

В результате получается

Листинг

f_back : <frame object at 0x812383c>

f_builtins : {'help': Type help for interactive help, or help(object) for help ab

f_code : <code object f at 0x401d83a0, file "<stdin>", line 11>

f_exc_traceback : None

f_exc_type : None

f_exc_value : None

f_globals : {'f': <function f at 0x401e0454>, '__builtins__': <module '__builtin__

f_lasti : 68

f_lineno : 16

f_locals : {'a': 'f_locals', 'fr': <frame object at 0x813c34c>}

f_restricted : 0

f_trace : None

Здесь f_back — предыдущий фрейм исполнения (вызвавший данный фрейм), f_builtins — пространство встроенных имен, как его видно из данного фрейма, f_globals — пространство глобальных имен, f_locals — пространство локальных имен, f_code — кодовый объект (в данном случае — байт–код функции f), f_lasti — индекс последней выполнявшейся инструкции байт–кода, f_trace — функция трассировки для данного фрейма (или None), f_lineno — текущая строка исходного кода, f_restricted — признак выполнения в ограничительном режиме.

Получить информацию о стеке интерпретатора можно с помощью функции inspect.stack. Она возвращает список кортежей, в которых есть следующие элементы:

Листинг

(фрейм–объект, имя_файла, строка_в_файле, имя_функции,

список_строк_исходного_кода, номер_строки_в_коде)

Трассировочные объекты также играют важную роль в интроспективных возможностях языка Python: с их помощью можно отследить место возбуждения исключения и обработать его требуемым образом. Для работы с трассировками предусмотрен даже специальный модуль — traceback.

Поделиться:
Популярные книги

Триумфальная арка

Ремарк Эрих Мария
Эксклюзивная классика
Проза:
классическая проза
9.42
рейтинг книги
Триумфальная арка

Воронцов. Перезагрузка. Книга 4

Тарасов Ник
4. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
фантастика: прочее
6.00
рейтинг книги
Воронцов. Перезагрузка. Книга 4

Многоточие сборки

Андреева Юлия Игоревна
1. От вчера до завтра
Документальная литература:
биографии и мемуары
прочая документальная литература
5.00
рейтинг книги
Многоточие сборки

Хроники Элении (сборник)

Эддингс Дэвид
Шедевры фантастики
Фантастика:
фэнтези
7.86
рейтинг книги
Хроники Элении (сборник)

Кодекс Охотника. Книга XV

Винокуров Юрий
15. Кодекс Охотника
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XV

Сирота

Шмаков Алексей Семенович
1. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Сирота

Вторая жизнь майора. Цикл

Сухинин Владимир Александрович
Вторая жизнь майора
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Вторая жизнь майора. Цикл

Атлантида

Касслер Клайв
15. Дирк Питт
Детективы:
боевики
6.67
рейтинг книги
Атлантида

Погоня

Касслер Клайв
1. Исаак Белл
Детективы:
прочие детективы
7.12
рейтинг книги
Погоня

Время зимы

Субботина Айя
Фантастика:
фэнтези
4.00
рейтинг книги
Время зимы

Цикл "Отмороженный". Компиляция. Книги 1-14

Гарцевич Евгений Александрович
Отмороженный
Фантастика:
боевая фантастика
рпг
постапокалипсис
5.00
рейтинг книги
Цикл Отмороженный. Компиляция. Книги 1-14

Тварь. Кассеты Андерсона

Спиллейн Микки
Детективы:
крутой детектив
5.00
рейтинг книги
Тварь. Кассеты Андерсона

Брат за брата

Колычев Владимир Григорьевич
Детективы:
криминальные детективы
6.62
рейтинг книги
Брат за брата

Телепат

Крюкова Тамара Шамильевна
Фантастика:
научная фантастика
7.83
рейтинг книги
Телепат