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

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

Жанры

Язык программирования 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.

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

Локки 10. Потомок бога

Решетов Евгений Валерьевич
10. Локки
Фантастика:
фэнтези
юмористическое фэнтези
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Локки 10. Потомок бога

Вернуть невесту. Ловушка для попаданки

Ардова Алиса
1. Вернуть невесту
Любовные романы:
любовно-фантастические романы
8.49
рейтинг книги
Вернуть невесту. Ловушка для попаданки

Герцог и я

Куин Джулия
1. Бриджертоны
Любовные романы:
исторические любовные романы
8.92
рейтинг книги
Герцог и я

Как я строил магическую империю 11

Зубов Константин
11. Как я строил магическую империю
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Как я строил магическую империю 11

Последний Герой. Том 4

Дамиров Рафаэль
Последний герой
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Последний Герой. Том 4

Эфемер

Прокофьев Роман Юрьевич
7. Стеллар
Фантастика:
боевая фантастика
рпг
7.23
рейтинг книги
Эфемер

Магнатъ

Кулаков Алексей Иванович
4. Александр Агренев
Приключения:
исторические приключения
8.83
рейтинг книги
Магнатъ

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

Иной. Том 5. Адская работа

Amazerak
5. Иной в голове
Фантастика:
боевая фантастика
городское фэнтези
технофэнтези
рпг
5.00
рейтинг книги
Иной. Том 5. Адская работа

Локки 6. Потомок бога

Решетов Евгений Валерьевич
6. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Локки 6. Потомок бога

Тринадцатый IX

NikL
9. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Тринадцатый IX

Бояръ-Аниме. Газлайтер. Том 35

Володин Григорий Григорьевич
35. История Телепата
Фантастика:
аниме
боевая фантастика
фэнтези
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 35

Феномен

Поселягин Владимир Геннадьевич
2. Уникум
Фантастика:
боевая фантастика
6.50
рейтинг книги
Феномен

Хозяин Стужи 3

Петров Максим Николаевич
3. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
7.00
рейтинг книги
Хозяин Стужи 3