Pull to refresh

Comments 16

UFO just landed and posted this here

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

Вы правы, ему можно скормить объект класса code, и он скомпилирует все его константы. Однако, если есть готовый класс, почему бы не импортировать его явно? Данный метод хорошо подходит для генерации API, когда названия классов и методов задаются из пространства имён, а не вручную.

Баловство все это.
Может кроме метаклассов. Да и они большинству разработчиков не известны, и это к счастью.
Почему это плохо:


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

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

Блин, зачем эта статья нужна? Есть же документация. Да и тема давно много раз обсосона с разных сторон. Ещё одна статья про метаклассы...

Я не заставляю вас читать.

Спасибо, не знал про FunctionType, когда понадобилась ast-магия подменял function.__code__.

Однако концепция динамического программирования хорошо раскрывает внутренне устройство Python.


Думаю, что Вы не имели ввиду устоявшийся термин.

Спасибо! Вы правы, я не имел ввиду классический термин. Оставлю как есть, времена меняются)

Зачем? Новичкам этого не надо, а более опытные и сами знают где найти исчерпывающую документацию. И, могу конечно ошибаться, но type вроде не абстрактный.

Type – метакласс, спасибо, что поправили.

Не натыкался раньше на FunctionType и MethodType, спасибо!
Почему у Вас:
builtins = [list(), dict(), tuple()]
for obj in builtins:
    print(type(obj))
<class 'type'>
<class 'type'>
<class 'type'>

А у меня:
builtins = [list(), dict(), tuple()]
>>> for obj in builtins:
...     print(type(obj))
...
<class 'list'>
<class 'dict'>
<class 'tuple'>

?
Add: Да, теперь норм
Спасибо, исправил. Случайно прописал вызовы классов. Попробуйте снова исправленный код.

Спасибо, я догадывался, но поспешил с терминологическими определениями.

Sign up to leave a comment.

Articles