Язык программирования Python
Шрифт:
Все это подчеркивает тот факт, что объекты в Python существуют не сами по себе, а являются частью системы: они и их отношения строго учитываются интерпретатором.
Сразу же следует оговориться, что Python имеет две стороны интроспекции: «официальную», которую поддерживает описание языка и многие его реализации, и «неофициальную», которая использует особенности той или иной реализации. С помощью «официальных» средств интроспекции можно получить информацию о принадлежности объекта тому или иному классу (функция type), проверить принадлежность экземпляра классу (isinstance),
Сказанное стоит подкрепить примерами.
В первом примере исследуется объект с помощью «официальных» средств. В качестве объекта выбрана обычная строка:
Листинг
>>> 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