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

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

Жанры

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

Все это подчеркивает тот факт, что объекты в Python существуют не сами по себе, а являются частью системы: они и их отношения строго учитываются интерпретатором.

Сразу же следует оговориться, что Python имеет две стороны интроспекции: «официальную», которую поддерживает описание языка и многие его реализации, и «неофициальную», которая использует особенности той или иной реализации. С помощью «официальных» средств интроспекции можно получить информацию о принадлежности объекта тому или иному классу (функция type), проверить принадлежность экземпляра классу (isinstance), отношение наследования между классами (issubclass), а также получить информацию, о которой говорилось чуть выше. Это как бы приборная доска машины. С помощью «неофициальной» интроспекции (это то, что под капотом) можно получить доступ к чему угодно: к текущему фрейму исполнения и стеку, к байт–коду функции, к некоторым механизмам интерпретатора (от загрузки модулей до полного контроля над внутренней средой исполнения). Сразу же стоит сказать, что этот механизм следует рассматривать (и тем более вносить изменения) очень деликатно: разработчики языка не гарантируют постоянство этих механизмов от версии к версии, а некоторые полезные модули используют эти механизмы для своих целей. Например, упомянутый ранее ускоритель выполнения Python–кода psyco очень серьезно вмешивается во фреймы исполнения, заменяя их своими объектами. Кроме того, разные реализации Python могут иметь совсем другие внутренние механизмы.

Сказанное стоит подкрепить примерами.

В первом примере исследуется объект с помощью «официальных» средств. В качестве объекта выбрана обычная строка:

Листинг

>>> s = «abcd»

>>> dir(s)

['__add__', '__class__', '__contains__', '__delattr__', '__doc__',

'__eq__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__',

'__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__',

'__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__',

'__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__',

'__str__', 'capitalize', 'center', 'count', 'decode',

'encode', 'endswith', 'expandtabs', 'find', 'index', 'isalnum', 'isalpha',

'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust',

'lower', 'lstrip', 'replace', 'rfind', 'rindex', 'rjust', 'rstrip',

'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title',

'translate', 'upper', 'zfill']

>>> id(s)

1075718400

>>> print str(s)

abcd

>>> print repr(s)

'abcd'

>>> type(s)

<type 'str'>

>>> isinstance(s, basestring)

True

>>> isinstance(s, int)

False

>>> issubclass(str, basestring)

True

«Неофициальные» средства интроспекции в основном работают в области представления объектов в среде интерпретатора. Ниже будет рассмотрено, как главная (на настоящий момент) реализация Python может дать информацию об определенной пользователем функции:

Листинг

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

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

Охотник

Щепетнов Евгений Владимирович
Фантастика:
фэнтези
боевая фантастика
5.40
рейтинг книги
Охотник

Тактик

Земляной Андрей Борисович
2. Офицер
Фантастика:
альтернативная история
7.70
рейтинг книги
Тактик

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4

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

Винокуров Юрий
25. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга XXV

Эпоха Опустошителя. Том I

Павлов Вел
1. Вечное Ристалище
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эпоха Опустошителя. Том I

Сильнейший Столп Империи. Книга 5

Ермоленков Алексей
5. Сильнейший Столп Империи
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 5

Пустоши

Сай Ярослав
1. Медорфенов
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Пустоши

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

NikL
4. Видящий смерть
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Тринадцатый IV

Черный маг императора 2

Герда Александр
2. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
6.00
рейтинг книги
Черный маг императора 2

Архонт

Прокофьев Роман Юрьевич
5. Стеллар
Фантастика:
боевая фантастика
рпг
7.80
рейтинг книги
Архонт

Имперец. Том 4

Романов Михаил Яковлевич
3. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Имперец. Том 4

Мастер 9

Чащин Валерий
9. Мастер
Фантастика:
боевая фантастика
попаданцы
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Мастер 9

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

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

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