Макросы Python: варианты использования?

Startup активность может быть какая-то деятельность «Всплеск». Просто показать приложение логотип, получая все вещи подготовки и принятия решения, куда идти дальше.

20
задан Xaerxess 17 May 2013 в 08:52
поделиться

9 ответов

Здесь уже есть несколько отличных ответов, поэтому я не буду больше публиковать. Я дам пару ошибок, хотя. Во-первых, не забудьте проверить известные протоколы , все остальное может быть непослушным. Как человек, чье хобби связано с ссылками telnet, вы, вероятно, захотите включить в поиск больше, чем http (s), но, возможно, захотите запретить, например, цель: или некоторые другие URL-адреса. Во-вторых, многие люди разграничивают свои ссылки в угловых скобках (gt / lt), таких как < http://theroughnecks.net > или в скобках "(url)", и нет ничего хуже, чем нажать ссылка и наличие закрывающей> или) идут вместе с остальной частью URL.

PS извините за самореферентные пробки;)

указать иерархию виджетов и свойства виджетов и иметь макрос, генерирующий код для создания всех виджетов)
  • Генераторы кода, которые используют внешние ресурсы во время компиляции. Например, макрос, который обрабатывает заголовки C и генерирует код FFI, или макрос, который генерирует определения классов на основе схемы базы данных
  • Декларативный FFI. Например, с указанием внешних структур, функций, их типов аргументов и наличием макросов для генерации соответствующих структур lisp, функций с отображением типов и кодом маршалинга
  • Веб-фреймворки на основе продолжений для Common Lisp используют макросы, которые преобразуют код в CPS (передача продолжения style) form.
  • 12
    ответ дан 29 November 2019 в 22:44
    поделиться

    См. Также этот вопрос: Синтаксис Pythonic macro

    2
    ответ дан 29 November 2019 в 22:44
    поделиться

    Существует список рассылки ( archive.org mirror ), который объясняет это довольно хорошо. Эта статья о Perl, но она также применима и к Python.

    4
    ответ дан 29 November 2019 в 22:44
    поделиться

    Боюсь, короткий ответ заключается в том, что вы не можете сделать это с помощью классов FileField или ImageField; они просто хранят путь к файлу и не имеют реального представления о реальных данных файла. Длинный ответ, однако, заключается в том, что все возможно, если вы используете API Django для написания собственных полей собственной модели .

    Как минимум, вы захотите реализовать value_to_string метод для преобразования данных для сериализации (пример в django docs по ссылке выше). Обратите внимание, что примеры в приведенной выше URL-ссылке также включают упоминание подклассов FileField и ImageField, что полезно для вашей ситуации!

    Вам также придется решить, должны ли данные храниться в базе данных или в файле. система. Если первый, вам придется реализовать свой пользовательский класс как поле Blob, включая настройку для каждой БД, которую вы хотите поддерживать; вам также потребуется обеспечить некоторую поддержку того, как данные должны быть возвращены пользователю из базы данных, когда HTML-запрос запрашивает URL-адрес .gif / .jpg / .png / .whwh. Если последний вариант, который является наиболее разумным способом ИМХО, вам придется реализовать методы для сериализации, десериализации двоичных данных в файловой системе. В любом случае, если вы реализуете их как подклассы FileField и ImageField, вы все равно сможете использовать инструменты администратора и другие модули, которые ожидают таких возможностей django.

    Если и только если вы решите использовать более сложный подход BLOB-объектов, вот фрагмент кода из старого проекта (когда я изучал Django), который обрабатывает blob для MySQL и PostgreSQL; вы'

    3
    ответ дан 29 November 2019 в 22:44
    поделиться

    I believe that macros run counter to Python's culture. Macros in Lisp allow the big ball of mud approach; you get to redefine the language to become more suited to your problem domain. Conversely Pythonic code uses the most natural built in feature of Python to solve a problem, instead of solving it in a way that would be more natural in a different language.

    Macros are inherently unpythonic.

    15
    ответ дан 29 November 2019 в 22:44
    поделиться

    Я не думаю, что Python нуждается в макросах, потому что они полезны для двух вещей:

    1. Создание DSL или более красноречивый синтаксис для чего-то (макрос Lisp LOOP является хорошим примером). В этом случае философия Python сознательно отказалась от этого. Если вы пропустили какое-то явное обозначение, вы всегда можете попросить PEP.

    2. Ускорение, предварительно вычисляя вещи во время компиляции. Python не ориентирован на скорость, поэтому вы всегда можете использовать функцию.

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

    И, как примечание, я бы предпочел увидеть перезапуски Lisp в Python, а не макросы.

    2
    ответ дан 29 November 2019 в 22:44
    поделиться

    В lisp макросы - это просто еще один способ абстрагировать идеи.

    Это пример неполного луча. tracer, написанный в clojure:

    (defmacro per-pixel
      "Macro.
    Excecutes body for every pixel. Binds i and j to the current pixel coord."
      [i j & body]
      `(dotimes [~i @width]
         (dotimes [~j @height]
           ~@body)))
    

    Если вы хотите сделать что-то для каждого пикселя с координатами (i, j), скажем, нарисовать черный пиксель, если я четный, вы бы написали:

    (per-pixel i,j
      (if (even? i)
        (draw-black i,j)))
    

    Это невозможно сделать без макросы, потому что @body может означать что-либо внутри (на пиксель ij @body)

    Нечто подобное было бы возможно и в python. Вам нужно использовать декораторы. Вы не можете делать все, что можете, используя макросы lisp, но они очень мощные

    Посмотрите этот урок по декоратору: http://www.artima.com/weblogs/viewpost.jsp?thread=240808

    5
    ответ дан 29 November 2019 в 22:44
    поделиться

    Прочтите «Лямбда-документы», чтобы вы могли понять, почему вообще нужно использовать продвижение макросов.

    Вы должны начать с «AIM-353 Lambda: The Ultimate Imperative» и следуйте за ним с «AIM-443 Lambda: The Ultimate GOTO». Оба могут быть найдены здесь:

    http://library.readscheme.org/page1.html

    1
    ответ дан 29 November 2019 в 22:44
    поделиться

    Вот один реальный пример, с которым я столкнулся и который был бы тривиален при наличии макросов или поддержки реального метапрограммирования, но должен быть сделан с помощью манипуляции байткодом CPython из-за отсутствия того и другого в Python:

    http://www.aminus.net/dejavu/chrome/common/doc/2.0a/html/intro.html#cpython

    Вот как эта проблема решена в Common Lisp с использованием комбинации обычных макросов и read-макросов для расширения синтаксиса (это можно было бы сделать без последних, но не без первых):

    http://clsql.b9. com/manual/csql-find.html

    Та же проблема решена в Smalltalk с помощью замыканий и метапрограммирования (Smalltalk - один из немногих однодиспетчерных ОО-языков, в котором передача сообщений действительно реализована правильно):

    http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg02096.html

    Здесь я попытался реализовать подход Smalltalk в Common Lisp, что является хорошей иллюстрацией того, как плохо поддерживается метапрограммирование в последнем:

    http://carcaddar.blogspot.com/2009/04/closure-oriented-metaprogramming-via.html

    6
    ответ дан 29 November 2019 в 22:44
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: