×
Traktatov.net » Язык программирования Python » Читать онлайн
Страница 138 из 141 Настройки

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

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

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