Was bedeutet die [] -eske Dekoratorsyntax in Python?

8

Hier ist ein Codeschnipsel von TurboGears 1.0.6:

%Vor%

Ich kann nicht herausfinden, wie sich eine Liste vor einer Funktionsdefinition auswirken kann.

Im Docstring von dispatch.generic heißt es:

  

Beachten Sie, dass Sie bei Verwendung älterer Python-Versionen '[dispatch.generic ()]' anstelle von '@ dispatch.generic ()' verwenden müssen.

OK, also ist es anscheinend ein Weg, Dekorator-ähnliches Verhalten in Pre-Decorator-Versionen von Python zu bekommen, aber wie zum Teufel kann es möglicherweise funktionieren?

    
Michael Gundlach 18.12.2008, 21:14
quelle

2 Antworten

11

Die Dekoratorsyntax wird von PyProtocols bereitgestellt.

"" " Schließlich ist es wichtig zu beachten, dass diese "magischen" Dekoratoren einen sehr hinterhältigen Hack verwenden: Sie missbrauchen den sys.settrace () - Debugger-Hook, um zu verfolgen, ob Zuweisungen stattfinden. Guido sieht das sehr schlecht, aber die bestehende Funktionalität des Hooks wird sich in 2.2, 2.3 oder 2.4 nicht ändern, also mach dir keine Sorgen darüber. Dies ist wirklich ein Trick, um "frühen Zugang" zu Dekoratoren zu bekommen, und der 2.4-Lebenszyklus wird ausreichend lang sein, um unseren Code auf 2.4-Syntax umzustellen. Irgendwo in Python 2.5 oder 2.6 kann add_assignment_advisor () den magischen Teil löschen und nur ein Rückwärts-Wrapper für die Dekoratoren sein, die ihn benutzen. "" " Ссылка

Es klingt also so, als würden die Entwickler den eigentlichen Dekorator mit einer Magie umhüllen, die sich in speziellen Code für Debugger einfügt, um zu manipulieren, was tatsächlich für die Funktion zugewiesen wird.

Die Python-Dokumentation sagt das über settrace

"" " Hinweis Die Funktion settrace () ist nur zum Implementieren von Debuggern, Profilern, Überdeckungstools und dergleichen gedacht. Sein Verhalten ist Teil der Implementierungsplattform und nicht Teil der Sprachdefinition und daher möglicherweise nicht in allen Python-Implementierungen verfügbar. "" "

    
Ed. 18.12.2008, 21:44
quelle
-2

Nichts Mysteriöses, es war nur wie Syntax vorher war.

Der Parser hat sich geändert, vermutlich weil der Python-Zen behauptet, dass "angesichts der Zweideutigkeit die Versuchung abzulehnen ist".

[] sollte nur für die Liste sein, und da ist es.

    
e-satis 18.12.2008 21:22
quelle

Tags und Links