Python-Makros: Anwendungsfälle?
Wenn Python hatte eine Makrofunktion ähnlich zu Lisp/Scheme (so etwas wie MetaPython), wie würden Sie es verwenden?
Wenn Sie einen Lisp - /Scheme-Programmierer, welche Art von Dingen verwenden Sie Makros für (andere als die Dinge, die einen klaren syntaktischen parallelen in Python wie eine while-Schleife)?
InformationsquelleAutor der Frage Rick Copeland | 2009-04-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einige Beispiele von lisp-Makros:
InformationsquelleAutor der Antwort dmitry_vk
Ich glaube, dass die Makros gegen Python ' s-Kultur. Makros in Lisp erlauben die big ball of mud Ansatz; Sie erhalten neu zu definieren, die Sprache an sich mehr geeignet, um Ihre problem-Domäne. Umgekehrt Pythonic code verwendet die meisten natürlichen eingebaute Funktion in Python, ein problem zu lösen, statt es zu lösen in einer Weise, die würde natürlicher sein, in einer anderen Sprache.
Makros sind von Natur aus unpythonic.
InformationsquelleAutor der Antwort RossFabricant
Dies ist eine etwas späte Antwort, aber MacroPy ist ein neues Projekt von mir zu bringen, Makros zu Python. Wir haben eine ziemlich umfangreiche Liste von demos, die alle use cases, die Makros zu implementieren, zum Beispiel die Bereitstellung einer äußerst präzise Art und Weise der Deklaration von Klassen:
MacroPy wurde verwendet, um features zu implementieren, wie:
Check-out der verlinkten Seite, um mehr zu erfahren; ich glaube, ich kann getrost sagen, dass die Anwendungsfälle, die wir zeigen, die weit alles übertreffen, was jemand vorgeschlagen, die bisher über diesen thread =D
InformationsquelleAutor der Antwort Li Haoyi
Hier ist ein Beispiel aus der Praxis, stieß ich auf das wäre trivial mit Makros oder real metaprogramming zu unterstützen, sondern hat zu tun mit CPython-bytecode-manipulation aufgrund der Abwesenheit der beiden in Python:
http://www.aminus.net/dejavu/chrome/common/doc/2.0a/html/intro.html#cpython
Dies ist, wie das problem gelöst werden, die in Common Lisp unter Verwendung einer Kombination von regelmäßigen Makros und lese-Makros zu erweitern, die syntax (und hätte es ohne die letztere, aber nicht erstere):
http://clsql.b9.com/manual/csql-find.html
Das gleiche problem, gelöst in Smalltalk mit Schließungen und metaprogramming (Smalltalk ist eine der wenigen single-dispatch OO-Sprachen, eigentlich bekommt message passing rechts):
http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg02096.html
Hier habe ich versucht zu implementieren, der Smalltalk-Ansatz in Common Lisp, das ist eine gute illustration dafür, wie metaprogramming ist schlecht unterstützt, im letzteren:
http://carcaddar.blogspot.com/2009/04/closure-oriented-metaprogramming-via.html
InformationsquelleAutor der Antwort vsedach
In lisp-Makros sind nur ein weiterer Weg, um abstrakte Ideen.
Dies ist ein Beispiel aus einer unvollständigen ray-tracer geschrieben clojure:
Wenn Sie etwas tun wollen, um jedes pixel mit den Koordinaten (i,j), sagen, zeichnen Sie einen schwarzen pixel, wenn ich sogar, Sie würde schreiben:
Dies ist nicht möglich ohne Makros, da @Körper kann bedeuten, dass etwas drin ist (pro pixel i j @body)
Etwas wie dieses wäre es möglich, in python auch. Müssen Sie die Verwendung von Dekoratoren.
Sie können nicht alles tun, was Sie tun können, mit lisp-Makros, aber Sie sind sehr mächtig
Check-out dieser decorator tutorial:
http://www.artima.com/weblogs/viewpost.jsp?thread=240808
InformationsquelleAutor der Antwort bigmonachus
Gibt es eine Mailingliste ( archive.org Spiegel ), die erklärt dieses ziemlich gut. Der post ist über Perl, aber es gilt für Python genauso gut.
InformationsquelleAutor der Antwort lfaraone
Einige Anwendungsfälle, die ich gesehen haben, bevor zu machen, class factories oder stripping-Protokollierung Aussagen des production code.
InformationsquelleAutor der Antwort Rick Copeland
Siehe auch diese Frage: Pythonic makro-syntax
InformationsquelleAutor der Antwort Chris Jester-Young
Ich glaube nicht, dass Python braucht, Makros, weil Sie nützlich sind für 2 Dinge:
Erstellen einer DSL-oder beredter syntax für etwas (Lisp-LOOP-makro ist ein schönes Beispiel). In diesem Fall Python-Philosophie entschied mich dagegen bewusst. Wenn es einige explizite notation, die Ihnen fehlen, können Sie immer Fragen, für eine PEP.
Die Dinge zu beschleunigen, indem precomputing Dinge, die zur compile-Zeit. Python ist nicht ausgerichtet auf Geschwindigkeit, so dass Sie können verwenden Sie immer eine Funktion statt.
Ich sage nicht, die Makros sind falsch, nur, dass Sie nicht passen Python-Philosophie. Sie können immer tun, ohne Sie, ohne viel code-Duplizierung, weil man duck typing-und operator-überladen.
Und als eine Randnotiz, ich würde viel lieber sehen, Lisp - Neustart in Python als Makros.
InformationsquelleAutor der Antwort
Lesen "Die Lambda-Papiere" so finden Sie vielleicht heraus, in der Regel, warum würde man nehmen advtage der Makros überhaupt.
Beginnen sollte man mit "AIM-353 Lambda:The Ultimate Imperative' und Folgen Sie es mit "ZIEL-443 Lambda: The Ultimate SPRINGEN'. Beides kann hier gefunden werden:
http://library.readscheme.org/page1.html
InformationsquelleAutor der Antwort grettke
Hy,
Für meinen eigenen Gebrauch habe ich ein Python-Modul (Espy), der ermöglicht, makro-Definitionen mit Argumenten, Schleife und bedingten code-Generierung:
Sie erstellen eine Quelle.espy-Datei, dann starten Sie die entsprechende Funktion, dann source.py generiert.
Ermöglicht es die Syntax wie folgt:
ist äquivalent zu:
Andere syntax:
ist äquivalent zu:
Mehr, Espy hat 2 Funktionen: "Makros" und "makro, wenn". Ein Beispiel:
ist übersetzt von Espy in:
Vollständige Dokumentation und den kostenlosen download finden Sie hier: http://elp.chronocv.fr
Ich dieses Modul verwenden, in vielen Fällen. Es ermöglicht eine mehr strukturierte und kürzere codes. Das ich generiert 65000 Zeilen von klaren und effizienten python-code aus 1000 Zeilen espy-code für eine neue Schach-engine-Projekt (noch in Entwicklung).
Wenn Python könnte gehören Makros in futur release, es würde sich mehr beeindruckend.
InformationsquelleAutor der Antwort elp
Ich würde es verwenden, um wrap
yield
um mir zu ermöglichen, zu bauen stärkere generator-pipelines.InformationsquelleAutor der Antwort pi.
Derzeit die einzige Möglichkeit, Funktionen können Hinzugefügt werden, um Python die Sprache ist durch eine PEP (Python Enhancement Proposal). Dies kann langsam sein, und hilft Ihnen nicht in den Fällen, wenn Sie möchten, fügen Sie ein feature der Sprache, die ist nur nützlich für Ihren Anwendungsfall.
Beispielsweise es ist eine PEP zu fügen Sie eine do-while-Schleife. Dies wird wahrscheinlich Hinzugefügt werden, um Python, aber der PEP wurde im Jahr 2003 gegründet. Ich würde gerne schreiben
do-while
Schleifen heute, und ich könnte das tun, wenn Python hatte Makros.Ähnlich, es war ein PEP hinzufügen, gekennzeichnet Pause und weiterdies wurde jedoch abgelehnt. Wenn gelabelten break-Anweisungen machen würde, meinen code übersichtlicher, ich konnte Sie umsetzen mit einem makro.
PEPs beiseite, ich würde auch gerne ein
unless
makro. Anstatt zu schreiben:Könnte ich schreiben:
Ich würde gerne eine
case
makro (oft alscond
in Lisp). Anstatt zu schreiben:Könnte ich schreiben:
Diese wäre einfach zu implementieren, wie Makros. Komplexer, nützliche Makros würde:
"hello there {user}"
(wahrscheinlich am besten umgesetzt als Leser makro)Derzeit sind diese features, die nur in anderen Sprachen. Mit Makros, die ich hinzufügen könnte, Sie zu Python. Ich könnte auch schreiben, PEPs, inklusive einer Beispiel-Implementierung. (Einige PEPs dies bereits tun, aber Sie sind gezwungen, zu ändern, den C-Quellcode des interpreters selbst.)
InformationsquelleAutor der Antwort Wilfred Hughes
Möglicherweise, wenn Sie wollen, dass der source-code zur Laufzeit, wie zum Debuggen (z.B. printf-debugging ein Ausdruck den Wert mit den Namen ist es so dass Sie nicht haben, schreiben Sie es zweimal).
Die einzige Möglichkeit die ich mir vorstellen könnte, es zu tun in python ist, um eine Zeichenfolge übergeben, eval.
InformationsquelleAutor der Antwort Roman A. Taycher
Gut, ich würde gerne statt
schreiben
in einigen Skripts, die viele debug-Ausdruck-Anweisungen.
Kann ich tun
dann
ist kürzer, aber das dauert noch immer zu viele Zeichen auf der Linie.
InformationsquelleAutor der Antwort Evgeni Sergeev
Will ich mit makro eine sql-Anweisung in python-code. -
select * from Tabelle1
InformationsquelleAutor der Antwort alex
Kommen aus einer C-Welt, ich würde wirklich zu schätzen in der Lage zu tun effiziente Protokollierung von Nachrichten reichen. Statt zu schreiben
mit Makros könnte man stattdessen etwas wie
InformationsquelleAutor der Antwort Mr Fooz