Сказанное стоит подкрепить примерами.
В первом примере исследуется объект с помощью «официальных» средств. В качестве объекта выбрана обычная строка:
>>>> 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)
>
>>>> 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
>
", 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)