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

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

Жанры

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

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

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

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

Проблема майора Багирова

Майер Кристина
1. Спецназ
Любовные романы:
современные любовные романы
6.60
рейтинг книги
Проблема майора Багирова

Законы Рода. Том 13

Андрей Мельник
13. Граф Берестьев
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 13

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15

О, Путник!

Арбеков Александр Анатольевич
1. Квинтет. Миры
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
О, Путник!

Прометей: каменный век

Рави Ивар
1. Прометей
Фантастика:
альтернативная история
6.82
рейтинг книги
Прометей: каменный век

Её (мой) ребенок

Рам Янка
Любовные романы:
современные любовные романы
6.91
рейтинг книги
Её (мой) ребенок

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

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Цвет сверхдержавы - красный. Трилогия

Симонов Сергей
Цвет сверхдержавы - красный
Фантастика:
попаданцы
альтернативная история
8.06
рейтинг книги
Цвет сверхдержавы - красный. Трилогия

Болтливый мертвец

Фрай Макс
7. Лабиринты Ехо
Фантастика:
фэнтези
9.41
рейтинг книги
Болтливый мертвец

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

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

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Лишняя дочь

Nata Zzika
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Лишняя дочь