Никогда не используйте отражение в производственном коде! Как насчет Python?

Я написал C #, и мантра, исходящая из высоких, кажется, «никогда не использует отражение в производственном коде». Я использовал его для тестового кода, но никогда ничего не делал в дикой природе. Все аргументы кажутся разумными, и всегда есть способ сделать это, добавив еще один слой абстракции или шаблона дизайна или что-то еще.

Теперь я начинаю писать какой-то серьезный код Python, интересно, действует ли тот же принцип. Кажется, что python спроектирован с учетом размышлений. Модули и классы хранят элементы в легкодоступном словаре. Классические классы Django's, например, берут строки для ссылок на элементы.

Я мог писать C # / Java в Python, но я действительно этого не хочу. Я все еще твердо верю в «отсутствие размышлений» для упомянутых языков. Является ли метод Python принципиально иным?

    5 Solutions collect form web for “Никогда не используйте отражение в производственном коде! Как насчет Python?”

    Как динамический язык Python принципиально отличается от статически типизированных языков, поэтому в нем все отражается 🙂 Также никогда не использовать отражение в производственном коде (для статических языков) для меня немного экстремально.

    Я думаю, что «нет отражения в производственном коде» неверно в c #.
    Отражение часто позволяет программисту делать что-либо иначе.
    Я бы сказал, «не размышления для непубличных членов в производственном коде» и «используйте рефлексию с осторожностью!» если они не используются правильно, вы можете потерять производительность. Используемое правильно может заставить вас повысить производительность (просто подумайте о статическом отражении). Не используйте отражение для массивного кода.
    Python – это динамический язык. Все понятия разные. Нормальность (и правильный способ сделать это) – это использование техников, о которых вы говорите.

    Да, в этом аспекте развитие Python принципиально отличается.

    Отражение в C # / Java означает способность среды выполнения знать информацию о запущенном коде и принимать решения на основе этой информации.

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

    PS Хотя следует избегать использования отражения в жестких петлях, и нужно знать, что отражение на один или два порядка медленнее, не следует бояться использовать его, когда это правильный инструмент для работы.

    ИМО, причина для меня в том, чтобы избегать использования отражения в производственном коде, является фактом, чем отражение может сделать код действительно сложнее поддерживать и отлаживать.

    Отражение – это очень продвинутая и мощная технология. Но это медленно. Вы можете использовать отражение, но не часто. Поэтому разработчики CLR добавили еще один классный тип в .NET 4.0 – динамический тип . Я настоятельно рекомендую вам обратиться к некоторым документам или книгам за дополнительной информацией. Fe CLR через C #.

     dynamic a = SomeFooInterface.GetsomeObjectWithUnknownInterface(); // returns object, for example, from another assembly. or some unknown instance. // But you know that there is method int GetValue() inside. // So you can call this method without any casts! int myValue = a.GetValue(); // This method is much faster then reflection! 

    CLR через C #:

    Есть также много случаев, когда программа должна воздействовать на информацию, о которой она не знает, пока она не работает. Хотя вы можете использовать языки программирования типа (например, C #) для взаимодействия с этой информацией, синтаксис имеет тенденцию быть неуклюжим, тем более, что вы склонны много работать со строками, а производительность также затруднена. Если вы пишете чистое приложение C #, то единственный случай, который вы имеете для работы с информацией, зависящей от времени выполнения, – это когда вы используете отражение (см. Главу 23). Однако многие разработчики также используют C # для связи с компонентами, которые не реализованы на C #. Некоторые из этих компонентов могут быть .NET-динамическими языками, такими как Python или Ruby , или объектами COM, которые поддерживают интерфейс IDispatch (возможно, реализованный на родном C или C ++) или объекты объектной модели HTML (DOM) (реализованы с использованием различных языков и технологии). Общение с объектами HTML DOM особенно полезно при создании приложения Microsoft Silverlight. Чтобы упростить работу разработчиков с использованием отражения или общения с другими компонентами, компилятор C # предлагает вам способ маркировать тип выражения как динамический. Вы также можете поместить результат выражения в переменную, и вы можете пометить тип переменной как динамический. Это динамическое выражение / переменная может затем использоваться для вызова элемента, такого как поле, свойство / индексатор, метод, делегат и операторы унарного / двоичного / преобразования. Когда ваш код вызывает элемент с использованием динамического выражения / переменной, компилятор генерирует специальный IL-код, который описывает желаемую операцию. Этот специальный код называется полезной нагрузкой. Во время выполнения код полезной нагрузки определяет точную операцию, выполняемую на основе фактического типа объекта, на который теперь ссылается динамическое выражение / переменная.

    Python - лучший язык программирования в мире.