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

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

Жанры

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

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

Санек 2

Седой Василий
2. Санек
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Санек 2

Цикл "Идеальный мир для Лекаря". Компиляция. Книги 1-30

Сапфир Олег
Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Цикл Идеальный мир для Лекаря. Компиляция. Книги 1-30

Восхождение Примарха 2

Дубов Дмитрий
2. Восхождение Примарха
Фантастика:
боевая фантастика
попаданцы
7.50
рейтинг книги
Восхождение Примарха 2

Я уже князь. Книга XIX

Дрейк Сириус
19. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я уже князь. Книга XIX

Лекарь Империи 10

Карелин Сергей Витальевич
10. Лекарь Империи
Фантастика:
городское фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 10

Охота

Грехов Тимофей
8. Ярар
Фантастика:
фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Охота

Изгой Проклятого Клана. Том 2

Пламенев Владимир
2. Изгой
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Изгой Проклятого Клана. Том 2

Последний Паладин. Том 9

Саваровский Роман
9. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 9

Третий Генерал: Том IX

Зот Бакалавр
8. Третий Генерал
Фантастика:
городское фэнтези
аниме
попаданцы
5.00
рейтинг книги
Третий Генерал: Том IX

Шайтан Иван 5

Тен Эдуард
5. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
5.00
рейтинг книги
Шайтан Иван 5

Черный Маг Императора 19

Герда Александр
19. Черный маг императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 19

Камень. Книга 3

Минин Станислав
3. Камень
Фантастика:
фэнтези
боевая фантастика
8.58
рейтинг книги
Камень. Книга 3

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

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

Идеальный мир для Лекаря 12

Сапфир Олег
12. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 12