Чем полезен самоанализ? - PullRequest
       4

Чем полезен самоанализ?

12 голосов
/ 21 февраля 2011

Я программировал в основном на PHP, и я пытаюсь перейти на Python. Я разбираюсь в PHP, и мне никогда не приходилось использовать возможности, подобные интроспекции / самоанализу. Что хорошего в интроспекции кода и в каких ситуациях я бы нашел его незаменимым?

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

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

Ответы [ 3 ]

12 голосов
/ 21 февраля 2011

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

Также, как уже показано в книге DiveintoPython, предположим, что вы создаете GUI Editor с функцией автозаполнения, вы хотите получить открытые методы объекта, которые можно вызывать во время выполнения, затем вы можете использовать методы самоанализа, такие как getattr для каждого метода, полученного через dir, и проверьте, является ли он callable, а затем отобразите его в списке автозаполнения.

4 голосов
/ 21 февраля 2011

Один пример, где я использовал самоанализ на реальном проекте:

У нас был сервис, управляющий фоновыми задачами, который называется TaskService. Каждая задача была фактически реализована как класс, реализующий методы Start () Stop () данного интерфейса. У нас был файл конфигурации, в котором мы сопоставляли каждую задачу с ее классом. Поэтому при запуске TaskService он просто просматривал файл конфигурации, и для каждой задачи он брал имя класса и создавал его экземпляр (во время выполнения) через отражение (самоанализ является частью отражения).

Другой пример того, где интроспекция может быть полезна, - использование аннотаций на вашем языке программирования. Аннотации используются для предоставления метаинформации о ваших классах другим сторонним программам (например, ORM), например, вы можете использовать аннотации, чтобы сказать, является ли класс сущностным классом (это имеет место в Java, я не знаю о Python, извините ) или о типе ассоциации определенных атрибутов и т. д.

Завершение кода является еще одним примером полезности самоанализа.

И, кстати, как вы упомянули, интроспекция очень помогает инструментам программной документации.

2 голосов
/ 21 февраля 2011

Я написал валидатор документации, который запускает тесты для файлов PDF, чтобы проверять различные проблемы с ними.Тесты - это методы специальных классов, которые представляют ветви, продукты, руководства и произвольные группировки Subversion различных типов.Механизм валидатора использует интроспекцию, чтобы найти эти специальные классы, создать их экземпляры и запустить их методы.

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

...