Что такое introspection python

Основные принципы программирования: интроспекция и рефлексия

Часто во время работы программы нам бывает нужна информация о данных — например, какой у них тип или являются ли они экземпляром класса (в ООП). Опираясь на эти знания, нам нужно проводить над данными некоторые операции, или даже изменять их — но необходимого вида данных у нас может и не быть! Если вы ничего не поняли, не расстраивайтесь — мы подробно во всём разберёмся. Всё, что я здесь описал — это иллюстрация целей двух возможностей, присутствующих почти в каждом современном языке программирования: интроспекции и рефлексии.

Интроспекция

Интроспекция — это способность программы исследовать тип или свойства объекта во время работы программы. Как мы уже упоминали, вы можете поинтересоваться, каков тип объекта, является ли он экземпляром класса. Некоторые языки даже позволяют узнать иерархию наследования объекта. Возможность интроспекции есть в таких языках, как Ruby, Java, PHP, Python, C++ и других. В целом, инстроспекция — это очень простое и очень мощное явление. Вот несколько примеров использования инстроспекции:

В Python самой распространённой формой интроспекции является использование метода dir для вывода списка атрибутов объекта:

В Ruby интроспекция очень полезна — в частности из-за того, как устроен сам язык. В нём всё является объектами — даже класс — и это приводит к интересным возможностям в плане наследования и рефлексии (об этом ниже). Если вы хотите узнать об этом больше, советую прочитать мини-цикл Metaprogramming in Ruby.

Прим. перев. Также не будет лишним прочитать нашу статью, посвящённую интроспекции в Ruby.

Вот несколько простых примеров интроспекции с использованием IRB (Interactive Ruby Shell):

Вы также можете узнать у объекта, экземпляром какого класса он является, и даже «сравнить» классы.

Однако интроспекция — это не рефлексия; рефлексия позволяет нам использовать ключевые принципы интроспекции и делать действительно мощные вещи с нашим кодом.

Рефлексия

Интроспекция позволяет вам изучать атрибуты объекта во время выполнения программы, а рефлексия — манипулировать ими. Рефлексия — это способность компьютерной программы изучать и модифицировать свою структуру и поведение (значения, мета-данные, свойства и функции) во время выполнения. Простым языком: она позволяет вам вызывать методы объектов, создавать новые объекты, модифицировать их, даже не зная имён интерфейсов, полей, методов во время компиляции. Из-за такой природы рефлексии её труднее реализовать в статически типизированных языках, поскольку ошибки типизации возникают во время компиляции, а не исполнения программы (подробнее об этом здесь). Тем не менее, она возможна, ведь такие языки, как Java, C# и другие допускают использование как интроспекции, так и рефлексии (но не C++, он позволяет использовать лишь интроспекцию).

По той же причине рефлексию проще реализовать в интерпретируемых языках, поскольку когда функции, объекты и другие структуры данных создаются и вызываются во время работы программы, используется какая-то система распределения памяти. Интерпретируемые языки обычно предоставляют такую систему по умолчанию, а для компилируемых понадобится дополнительный компилятор и интерпретатор, который следит за корректностью рефлексии.

Мне кажется, что мы сказали много об определении рефлексии, но смысла это пока несёт мало. Давайте взглянем на примеры кода ниже (с рефлексией и без), каждый из которых создаёт объект класса Foo и вызывает метод hello.

Этот список отнюдь не исчерпывает возможности рефлексии. Это очень мощный принцип, который к тому же является обычной практикой в метапрограммировании. Тем не менее, при использовании рефлексии нужно быть очень внимательным. Хотя у неё и есть свои преимущества, код, использующий рефлексию, значительно менее читаем, он затрудняет отладку, а также открывает двери по-настоящему плохим вещами, например, инъекции кода через выражения eval.

Eval-выражения

Некоторые рефлективные языки предоставляют возможность использования eval-выражений — выражений, которые распознают значение (обычно строку) как выражение. Такие утверждения — это самый мощный принцип рефлексии и даже метапрограммирования, но также и самый опасный, поскольку они представляют собой угрозу безопасности.

Рассмотрим следующий пример кода на Python, который принимает данные из стороннего источника в Сети (это одна из причин, по которой люди пользуются eval-выражениями):

Защита программы будет нарушена, если кто-то передаст в метод get_data() такую строку:

Для безопасного использования eval-утверждений нужно сильно ограничивать формат входных данных — и обычно это лишь занимает лишнее время.

Заключение

Интроспекция и рефлексия — это очень мощные инструменты современных языков, и их понимание может позволить вам писать по-настоящему крутой код. Ещё раз отметим: интроспекция — это изучение атрибутов объекта, а рефлексия — это манипуляция ими. Будьте внимательны при использовании рефлексии, поскольку она может сделать ваш код нечитаемым и уязвимым. Чем больше сила, тем больше и ответственность — вот девиз всего, что связано с метапрограммированием.

Источник

Introspection in Python

last modified December 15, 2021

In this part of the Python tutorial, we talk about introspection.

Introspection is an act of self examination. In computer programming, introspection is the ability to determine type or properties of objects at runtime. Python programming language has a large support of introspection. Everything in Python is an object. Every object in Python may have attributes and methods. By using introspection, we can dynamically inspect Python objects.

Python dir function

The dir function returns a sorted list of attributes and methods belonging to an object.

Here we see an output of the dir function for a tuple object.

Our investigation showed that there is a __doc__ attribute for a tuple object.

The example examines several objects using the dir function: a user defined object, native data types, a function, a string, or a number.

Without any argument, dir returns names in the current scope.

We execute the dir function before and after we include some modules.

Python type function

The type function returns the type of an object.

The example print various types of objects to the console screen.

The id() function

The id returns a special id of an object.

The code example prints ids of various objects, both built-in and custom.

Python sys module

The sys module provides access to system specific variables and functions used or maintained by the interpreter and to functions that interact strongly with the interpreter. The module allows us to query about the Python environment.

In the above code we examine the Python version, platform, and search path locations.

We can also use the dir function to get a full list of variables and functions of the sys module.

The executable is a string giving the name of the executable binary for the Python interpreter, on systems where this makes sense.

This gives a list of command line arguments passed to a Python script.

The byteorder is an indicator of the native byte order. This will have the value ‘big’ on big-endian (most-significant byte first) platforms, and ‘little’ on little-endian (least-significant byte first) platforms.

Other introspection

Next we show various other ways of inspecting Python objects.

The hasattr function checks if an object has an attribute. The getattr function returns the contents of an attribute if there are some.

The isinstance function checks if an objects is an instance of a specific class.

We can get the describtion of a function interactively.

As we know, everything is an object in Python; even numbers and strings. The object is a base type of all objects in Python.

The issubclass function checks if a specific class is a derived class of another class.

The __doc__ attribute gives some documentation about an object and the __name__ attribute holds the name of the object.

In our example, we create a list of three functions: one custom and two native. We go through the list and print the __name__ and the __doc__ attributes.

Finally, there is also a callable function. The function checks if an object is a callable object (a function).

In the code example we check if three objects are callables.

The fun function and the setName method are callables. (A method is a function bound to an object.)

In this part of the Python tutorial, we have talked about introspection in Python. More tools for doing introspection can be found in the inspect module.

Источник

Самоанализ кода в Python

Самоанализ — это способность определять тип объекта во время выполнения. Все в Python является объектом. Каждый объект в Python может иметь атрибуты и методы. Используя интроспекцию, мы можем динамически исследовать объекты Python. Интроспекция кода используется для изучения классов, методов, объектов, модулей, ключевых слов и получения информации о них, чтобы мы могли ее использовать. Самоанализ выявляет полезную информацию об объектах вашей программы. Python, являющийся динамическим объектно-ориентированным языком программирования, обеспечивает огромную поддержку интроспекции. Python поддерживает интроспекцию глубоко и широко по всему языку.
Python предоставляет некоторые встроенные функции, которые используются для самоанализа кода.
1. type (): эта функция возвращает тип объекта.

# Показ программы Python
# использование функции типа

# тип печати по математике

2. dir (): эта функция возвращает список методов и атрибутов, связанных с этим объектом.

# Показ программы Python
# использование функции dir ()

# методы печати и атрибуты rk

# методы печати и атрибуты rk

3. str (): эта функция преобразует все в строку.

# Показ программы Python
# использование функции str ()

# преобразование целого числа
# в строку

# список преобразования
# в строку

4. id (): эта функция возвращает специальный идентификатор объекта.

# Показ программы Python
# использование функции id ()

Источник

Что такое introspection python

Интроспекция предоставляет полезную информацию об объектах вашей программы. Python, динамический, объектно-ориентированный язык программирования, обеспечивает потрясающую поддержку интроспекции. В этой статье демонстрируются многие из его возможностей, начиная самыми простыми видами помощи и заканчивая более сложными формами изысканий.

Что такое интроспекция?

В случае программирования интроспекция означает возможность изучать что-либо, чтобы определить, что это такое, что оно умеет и что может делать. Интроспекция предоставляет программистам огромные гибкость и контроль. Если вы хоть раз работали с языками программирования, которые поддерживают интроспекцию, вы, возможно, испытываете схожие чувства: «непроанализированный объект не стоит воплощения».

В этой статье рассмотрены интроспективные возможности языка программирования Python. Питоновская поддержка интроспекции пронизывает язык вглубь и вширь. В действительности, Python трудно представить без его интроспективных возможностей. Прочитав эту статью, вы сможете с легкостью «проникнуть в самое сердце» своих объектов Python.

Давайте приступим к нашему исследованию, используя Python интерактивно. При запуске Python из командной строки мы входим в оболочку Python, где можем вводить код Python и получать немедленный ответ от интерпретатора Python. (Команды, перечисленные в этой статье, выполнятся надлежащим образом для Python 2.2.2. Возможно, вы получите другие результаты и ошибки, если используете более раннюю версию. Последнюю версию Python можно скачать с Web-сайта Python (см. Ресурсы).)

Листинг 1. Запускаем интерпретатор Python в интерактивном режиме

Запустив Python и посмотрев на его приглашение (>>>), вы, возможно, зададитесь вопросом, какие слова распознает Python. В большинстве языков программирования существуют зарезервированные, или ключевые слова, которые имеют специальное назначение в данном языке, и Python не является исключением. Возможно, вы также обратили внимание, что Python предлагает напечатать help для получения более подробной информации. Наверное, мы можем запросить у Python какую-нибудь справку о ключевых словах.

Интерактивная справочная утилита Python

Как предлагалось выше, давайте напечатаем help и посмотрим, получим ли мы какую-нибудь информацию о ключевых словах:

Листинг 2. Запрашиваем у Python справочную информацию

Листинг 3. Запускаем справочную утилиту

Похоже, что мы немного продвинулись. Давайте введем keywords в приглашении справки:

Листинг 4. Запрашиваем справку о keywords

Листинг 5. Получаем неполный список доступных модулей

Модуль sys

Листинг 6. Импортируем модуль sys

Переменная platform сообщает, в какой операционной системе мы работаем:

Атрибут sys.platform

Текущая версия Python доступна и в виде строки, и в виде кортежа (кортеж содержит последовательность объектов):

Листинг 8. Атрибуты sys.version и sys.version_info

Переменная maxint показывает наибольшее допустимое целое значение:

Атрибут sys.maxint

Листинг 10. Атрибут sys.argv

Если мы запустим другую оболочку Python, как, например, PyCrust (за более подробной информацией о PyCrust см. ссылку, приведенную в Ресурсах), то увидим что-нибудь вроде этого:

Листинг 11. Атрибут sys.argv при использовании PyCrust

Листинг 12. Атрибут path

Листинг 13. Атрибут sys.modules

Модуль keyword

Давайте вернемся к нашему вопросу о ключевых словах Python. Даже несмотря на то, что справка предоставила нам список ключевых слов, оказывается, что часть информации справки жестко закодирована. Список ключевых слов, получается, жестко закодирован, что в конце концов не слишком интроспективно. Давайте посмотрим, сможем ли мы получить такую информацию непосредственно из одного из модулей в стандартной библиотеке Python. Если мы напечатаем help(‘modules keywords’) в приглашении Python, то увидим следующее:

Листинг 14. Запрашиваем справку о модулях с ключевыми словами

Листинг 15. Список ключевых слов модуля keyword

Функция dir()

Листинг 16. Атрибуты модуля keyword

Листинг 17. Атрибуты модуля sys

Без указания аргумента dir() возвращает имена в текущей области видимости. Заметьте, что keyword и sys присутствуют в этом списке, поскольку мы импортировали их ранее. Импортирование модуля добавляет имя этого модуля в текущую область видимости:

Листинг 18. Имена в текущей области

Листинг 19. Что такое __builtins__?

Листинг 20. Атрибуты модуля __builtins__

Функция dir() работает со всеми типами объектов, включая строки, целые числа, списки, кортежи, словари, функции, экземпляры и методы классов и классы, определенные пользователем. Давайте применим dir() к строковому объекту и посмотрим, что возвратит Python. Как вы можете видеть, даже простая строка Python имеет ряд атрибутов:

Листинг 21. Атрибуты строки

Поэкспериментируйте со следующими примерами, чтобы выяснить, что они возвратят. Заметьте, что символ # обозначает начало комментария. Все от начала комментария и до конца строки игнорируется Python:

Листинг 22. Применяем dir() к другим объектам

Чтобы продемонстрировать динамическую сущность интроспективных возможностей Python, давайте рассмотрим некоторые примеры, применяя dir() к классу, определенному пользователем, и нескольким экземплярам класса. Определим наш собственный класс интерактивно, создадим несколько экземпляров этого класса, и, добавив уникальный атрибут только к одному из этих экземпляров, посмотрим, сможет ли Python со всем этим разобраться. Ниже приведены результаты:

Листинг 23. Применяем dir() к классам, определенным пользователем, экземплярам класса и атрибутам

Строки документации

Листинг 24. Строка документации модуля

И вновь, Python поддерживает даже строки документации для классов и методов, которые определены интерактивно в оболочке Python. Давайте рассмотрим строки документации для нашего класса Person и его метода intro :

Листинг 25. Строки документации класса и метода

Листинг 26. Строка документации функции

Опрос объектов Python

Мы упоминали слово «объект» уже несколько раз, но так и не дали ему определения. Объект в среде программирования во многом подобен объекту реального мира. Реальный объект имеет определенную форму, размер, вес и другие характеристики. Реальный объект может реагировать на свое окружение, взаимодействовать с другими объектами или выполнять задачу. Компьютерные объекты пытаются моделировать объекты, которые окружают нас в реальном мире, включая абстрактные объекты, как, например, документы, каталоги и бизнес-процессы.

Если у вас произвольный объект, возможно, тот, который был передан в качестве аргумента в функцию, вы, наверное, захотите что-нибудь узнать об этом объекте. В этом разделе мы рассмотрим, как объекты Python отвечают на следующие вопросы:

Листинг 27. Что скрыто в имени

Листинг 28. Определяем: выполнение или импорт

Функция type() помогает нам определить, является ли объект строкой, целым числом или другим видом объекта. Для этого она возвращает объект типа, который можно сравнивать с типами, определенными в модуле types :

Листинг 29. Не твоего ли я типа?

Тождественность

Как было указано выше, каждый объект имеет тождественность, тип и значение. Важно заметить, что на один и тот же объект может указывать более одной переменной; с другой стороны, переменные могут ссылаться на объекты, которые выглядят похожими (у них одинаковый тип и значение), но нетождественны. Понятие тождественности объекта приобретает особо важное значение при внесении изменений в объект, таких как добавление элемента в список, что показано в приведенном ниже примере, в котором переменные blist и clist указывают на один и тот же объект списка. Как вы можете видеть, функция id() возвращает уникальный идентификатор для любого заданного объекта:

Листинг 30. «Рубеж»

Атрибуты

Листинг 31. Наличие атрибута; получение атрибута

Вызываемые структуры

Объекты, которые представляют потенциальное поведение (функции и методы), могут быть запущены, или вызваны. С помощью функции callable() мы можем установить, вызываемый ли это объект:

Листинг 32. Можешь что-нибудь для меня сделать?

Экземпляры

Хотя функция type() и выдает тип объекта, с помощью функции isinstance() мы также можем выяснить, является ли объект экземпляром определенного типа или определенного пользователем класса:

Листинг 33. Ты один из них?

Производные классы

Листинг 34. Не ты ли мой предок?

Время опроса

Давайте подведем итог, собрав вместе некоторые из интроспективных технологий, которые мы рассмотрели в последнем разделе. Для этого определим нашу собственную функцию interrogate(), которая выводит различную информацию о любом объекте, передаваемом в нее. Ниже приведен код, который сопровождается несколькими примерами его применения:

Листинг 35. Никто и не надеялся

Как следует из последнего примера, наша функция interrogate() работает даже сама с собой. Большей ретроспективности вы вряд ли сможете получить.

Заключение

Кто бы мог подумать, что интроспекция окажется столь простой и полезной? И все же, заканчивая, я должен предостеречь: не примите результаты интроспекции за знание в последней инстанции. Опытный программист Python знает, что всегда есть больше, чем дает интроспекция, и, следовательно, ее исход вовсе не исчерпывающее знание. Программирование порождает больше вопросов, чем ответов. Что исключительно хорошо в Python, как мы поняли из этой статьи, так это то, что он действительно отвечает на ваши вопросы. Что до меня, не считайте себя обязанными отплатить мне за то, что я помог вам понять, что предлагает Python. Программирование на Python само по себе награда. Все, что я прошу у своих друзей-Питонистов, это угощения за счет общественности.

Ресурсы

Об авторе

[1] Чтобы получить более подробную информацию, напечатайте «help», «copyright», «credits» или «license».

[2] Напечатайте help() для получения интерактивной справки или help(object) для справки об объекте.

[3] Добро пожаловать в Python 2.2! Это интерактивная справочная утилита.

Если вы используете Python впервые, вам обязательно следует познакомиться с учебным пособием, доступным в Интернете по адресу: http://www.python.org/doc/tut/.

Введите имя любого модуля, ключевое слово или тему, чтобы получить справку о написании программ Python и использовании его модулей. Чтобы выйти из этой утилиты и вернуться в интерпретатор, напечатайте «quit».

[4a] Ниже приведен список ключевых слов Python. Для получения более подробной справки введите любое ключевое слово.

[4b] Вы вышли из справочной утилиты и вернулись в интерпретатор Python. Если вам необходимо получить справку об отдельном объекте непосредственно из интерпретатора, напечатайте «help(object)». Выполнение «help(‘string’)» имеет такой же результат, как ввод отдельной строки в приглашении справки.

[5a] Пожалуйста, подождите немного, пока я подготовлю список всех доступных модулей.

[5b] Чтобы получить более подробную справку, введите имя любого модуля. Или напечатайте «modules spam», чтобы найти модули, в описании которых присутствует слово » spam».

[14] Ниже приведен список соответствующих модулей. Чтобы получить более подробную информацию, введите имя любого модуля.

[22] dir(42) # Целое число (и смысл жизни)

dir([]) # Список (пустой список на самом деле)

dir(()) # Кортеж (также пустой)

dir(<>) # Словарь (аналогично)

dir(dir) # Функция (функции также объекты)

[24] Встроенные функции, исключения и другие объекты.

[26] Возвращает список имен в алфавитном порядке, включающий (некоторые из) атрибутов заданного объекта, и атрибутов, которые из него доступны:

Без аргумента: имена в текущей области.

Объект модуля: атрибуты модуля.

Объект типа или класса: его атрибуты и рекурсивно атрибуты его баз.

Иначе: атрибуты объекта, атрибуты его класса и рекурсивно атрибуты базовых классов его класса.

[29] Определяет имена для всех типов, известных стандартному интерпретатору.

Типы, которые являются частью факультативных модулей (например, array) ниже не перечислены.

[30] Вернуть тождественность объекта. Она гарантировано уникальна среди одновременно существующих объектов. (Намек: это адрес памяти объекта.)

[31a] Вернуть, есть ли у объекта атрибут с заданным именем.

(Это выполняется посредством вызова getattr(object, name) и перехватыванием исключения.)

[31b] Получить упомянутый атрибут из объекта; getattr(x, ‘y’) эквивалентно x.y.

Если задается аргумент по умолчанию, он возвращается, если атрибут не существует; без этого аргумента в этом случае возбуждается исключение.

[31c] Вернуть тождественность объекта. Она гарантировано уникальна среди одновременно существующих объектов. (Намек: это адрес памяти объекта.)

[32] Вернуть, является ли объект вызываемым (например, какой-нибудь вид функции).

Заметьте, что классы являются вызываемыми, как и экземпляры с методом __call__().

[33] Вернуть, является ли объект экземпляром заданного класса или его подкласса.

Если тип в качестве второго аргумента, вывести, является ли это типом объекта.

[34] Вернуть, является ли класс С производным классом класса В.

Источник

Python inspect module

Python’s inspect module provides the introspection of live objects and the source code of the same.

It also provides the introspection of the classes and functions used throughout the program.

The inspect module provides the user to make use of functions/methods in it to fetch the source code for the same, extract and parse the needed library documentation.

This module is used to fetch information about the functions, classes and modules in the particular user’s program. This is made available by performing inspection on the module’s properties, classes/methods of the module, etc.

Python inspect module functionalities

1. Introspection of a module

Initially, we need to create a sample module along with classes/functions for introspection i.e. test.py

test.py

Then we will introspect the created module using inspect.getmembers() function.

Note: The python file containing the sample module and the file containing the introspection code should be placed under the same directory.

Code for Introspection of Module:

Output:

2. Introspection of classes in a module

The getmembers() function along with the isclass property identifier is used to inspect the classes within a module.

Output:

3. Introspection of methods/functions in a class

The getmembers() function along with the isfunction property identifier is used to inspect the classes within a module.

Output:

4. Introspection of objects of a class

Output:

5. Retrieval of source of a class

The getsource() functions returns the source of a particular module/class.

Output:

6. Retrieval of source of a method/function

Output:

7. Fetching the method signature

The inspect.signature() method returns the signature of the method, thus making it easy for the user to understand the kind of arguments passed to the method.

Output:

8. Documentation of Strings for a class

The inspect module’s getdoc() function extracts a particular class and its functions to represent to the end-user.

Output:

9. Introspecting Class Hierarchies

The getclasstree() method returns the hierarchy of the classes and its dependencies. It creates a tree-structure using tuples and lists from the given classes.

Output:

10. Introspection of Frames and Stacks in the run-time environment

The inspect module also inspects the function’s dynamic environment of the program during its execution. The functions mostly work with call stack and call frames.

currentframe() depicts the frame at the top of the stack for the current executing function. getargvalues() results as a tuple with the names of the arguments, and a dicttionary of local values from the frames.

Output:

Conclusion

Thus, in this article, we have understood the functionalities offered by the inspect module of Python.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *