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

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

Жанры

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

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

Законник Российской Империи. Том 2

Ткачев Андрей Юрьевич
2. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
дорама
6.40
рейтинг книги
Законник Российской Империи. Том 2

Я - злодейка в дораме. Сезон второй

Вострова Екатерина
2. Выжить в дораме
Фантастика:
уся
фэнтези
сянься
попаданцы
5.00
рейтинг книги
Я - злодейка в дораме. Сезон второй

Ученик. Книга третья

Первухин Андрей Евгеньевич
3. Ученик
Фантастика:
фэнтези
7.64
рейтинг книги
Ученик. Книга третья

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

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

Династия. Феникс

Майерс Александр
5. Династия
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Династия. Феникс

Неудержимый. Книга XIII

Боярский Андрей
13. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XIII

Принятие

Хайд Адель
3. История Ирэн
Фантастика:
попаданцы
альтернативная история
фэнтези
6.00
рейтинг книги
Принятие

(Не)свободные, или Фиктивная жена драконьего военачальника

Найт Алекс
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(Не)свободные, или Фиктивная жена драконьего военачальника

Бастард Императора. Том 11

Орлов Андрей Юрьевич
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 11

Санек 2

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

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

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

Эволюционер из трущоб. Том 2

Панарин Антон
2. Эволюционер из трущоб
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Эволюционер из трущоб. Том 2

Солнечный флот

Вайс Александр
4. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Солнечный флот

Аристократ из прошлого тысячелетия

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