В этой статье мы рассмотрим самые полезные функций интроспекции в Python.
Что такое интроспекция?
Интроспекция — это способность объекта во время выполнения получить тип, доступные атрибуты и методы, а также другую информацию, необходимую
для выполнения дополнительных операций с объектом.
Прочитав эту статью, вы сможете с легкостью "проникнуть в каждый байт" своих объектов Python.
Мы начнем наше изучение Python интроспекции в общем виде, в каком только возможно, а затем научимся использовать более сложные технологии.
Давайте приступим к нашему исследованию, будем использовать интерактивную оболочку Python.
При запуске Python из командной строки мы входим в оболочку Python, где можем вводить код Python и получать немедленный ответ от интерпретатора. (Команды, перечисленные в этой статье, выполнятся
надлежащим образом для Python 3.7.0 Возможно, вы получите другие результаты и ошибки, если используете более раннюю версию.
Последнюю версию Python можно скачать по ссылке https://www.python.org.)
Запускаем интерпретатор Python в интерактивном режиме
C:\Windows\system32>Python
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:06:47) [MSC v.1914 32 bit (Intel)] on
Type "help", "copyright", "credits" or "license" for more information.
>>>
Запустив Python мы видим приглашение (>>>). нам предложено ввести help
для получения более подробной информации.
Python справка
>>> help()
Welcome to Python 3.7's help utility!
If this is your first time using Python, you should definitely check out
the tutorial on the Internet at https://docs.python.org/3.7/tutorial/.
Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules. To quit this help utility and
return to the interpreter, just type "quit".
To get a list of available modules, keywords, symbols, or topics, type
"modules", "keywords", "symbols", or "topics". Each module also comes
with a one-line summary of what it does; to list the modules whose name
or summary contain a given string such as "spam", type "modules spam".
Мы немного продвинулись. Замечаем знакомое слово keywords и пробем напечатать его:
help> keywords
Here is a list of the Python keywords. Enter any keyword to get more help.
False class from or
None continue global pass
True def if raise
and del import return
as elif in try
assert else is while
async except lambda with
await finally nonlocal yield
break for not
Мы ввели keywords и мы уже знаем список ключевых слов Python.
Напечатаем quit и вернемся к приглашению Python.
help> quit
You are now leaving help and returning to the Python interpreter.
If you want to ask for help on a particular object directly from the
interpreter, you can type "help(object)". Executing "help('string')"
has the same effect as typing a particular string at the help> prompt.
>>>
Функция dir(), наиболее известная из всех интроспекции Python.
Она возвращает отсортированный список имен атрибутов для переданного в нее объекта.
>>> list = [1,2,3,4,5]
>>> dir(list)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__
', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iad
mul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul
__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__
, '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', '
xtend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>>
Если ни один объект не указан, dir() возвращает имена в текущей области видимости.
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '_
'list', 'string']
>>>
Функция type().
Интуитивно можно понять, эта функция возвращает тип объекта, который может быть примитивным типом данных, объектом, классом или модулем.
>>> type(1.2)
<class 'float'>
>>>
5.Особенно полезной, является функция isinstance().
Функция определяет, является ли объект экземпляром указанного класса.
Простейший практический пример использования:
>>> isinstance([1,2,3,4,5], tuple)
False
>>>
Id() — Не менее важная функция интроспекции в Python.
Она возвращает идентификатор указанного объекта.
Пример ниже демонстрирует вызов данной функции.
>>> c = 1
>>> d = 2
>>> id(c)
1631729920
>>> id(d)
1631729936
>>>
Мы можем поменять переменные и посмотреть что произойдет.
Выполним распространненый код "c, d = d, c" который меняет значения двух переменных.
>>> c, d = d, c
>>> id(c)
1631729936
>>> id(d)
1631729920
>>>
По моему мнению это очень круто, эти две переменные успешно поменялись местами.
Что скрыто в имени.
>>> directory = dir # Создаем переменную directly
>>> directory() # То же что при вызове dir()
['__builtins__', '__doc__', '__name__', 'directory']
>>> dir.__name__ # Узнаем имя
'dir'
>>> directory.__name__ # Имя созданной переменной
'dir'
>>> __name__ # Узнаем расположение
'__main__'
Модули имеют имена, а сам интерпретатор Python считается модулем верхнего уровня.
Если вы запускаете Python интерактивно, локальной переменной __name__ присваивается значение '__main__'.
Когда вы выполняете модуль из командной строки, а не импортируете его
в другой модуль, его атрибуту __name__ присваивается значение '__main__', а не действительное имя этого модуля.
Так модули могут взглянуть на свое значение __name__, чтобы определиться, используются ли они в качестве поддержки для другой
программы или как основное приложение.
Определяем: импорт или выполнение.
if __name__ == '__main__':
# Сделать можем вызвать главную функцию main()
main()
else:
# Ничего не делать. Этот модуль был импортирован...!
Выводы
Интроспекция является простой и полезной штукой? Но не нужно принимать результаты интроспекции за великое знание.
Опытный программист Python знает, что всегда есть больше, чем дает интроспекция.
Скаждой новой строкой кода у тебя должно возникать больше вопросов, чем ответов.
Программирование на Python это лекго и интересно!