PEP 3129 – Klassen-Dekoratoren
- Autor:
- Collin Winter <collinwinter at google.com>
- Status:
- Final
- Typ:
- Standards Track
- Erstellt:
- 01. Mai 2007
- Python-Version:
- 3.0
- Post-History:
- 07. Mai 2007
Inhaltsverzeichnis
Zusammenfassung
Dieses PEP schlägt Klassen-Dekoratoren vor, eine Erweiterung der Funktions- und Methoden-Dekoratoren, die in PEP 318 eingeführt wurden.
Begründung
Als Funktions-Dekoratoren ursprünglich für die Aufnahme in Python 2.4 debattiert wurden, galten Klassen-Dekoratoren dank Metaklassen als obskur und unnötig. Nach mehreren Jahren Erfahrung mit der Release-Serie Python 2.4.x und zunehmender Vertrautheit mit Funktions-Dekoratoren und deren Verwendungen bewerteten der BDFL und die Community Klassen-Dekoratoren neu und empfahlen ihre Aufnahme in Python 3.0 [1].
Der motivierende Anwendungsfall war, bestimmte Konstrukte einfacher auszudrücken und weniger von Implementierungsdetails des CPython-Interpreters abhängig zu machen. Während es möglich ist, Klassen-Dekorator-ähnliche Funktionalität mit Metaklassen auszudrücken, sind die Ergebnisse im Allgemeinen unangenehm und die Implementierung hochgradig fehleranfällig [2]. Darüber hinaus werden Metaklassen vererbt, während Klassen-Dekoratoren dies nicht tun, was Metaklassen für einige, spezifische Verwendungen von Klassen-Dekoratoren ungeeignet macht. Die Tatsache, dass groß angelegte Python-Projekte wie Zope diese wilden Verrenkungen durchmachten, um etwas wie Klassen-Dekoratoren zu erreichen, überzeugte den BDFL.
Semantik
Die Semantik und die Designziele von Klassen-Dekoratoren sind die gleichen wie für Funktions-Dekoratoren (PEP 318, PEP 318); der einzige Unterschied ist, dass Sie eine Klasse anstelle einer Funktion dekorieren. Die folgenden beiden Ausschnitte sind semantisch identisch
class A:
pass
A = foo(bar(A))
@foo
@bar
class A:
pass
Für eine detaillierte Untersuchung von Dekoratoren verweisen Sie bitte auf PEP 318.
Implementierung
Die Anpassung der Python-Grammatik zur Unterstützung von Klassen-Dekoratoren erfordert die Änderung von zwei Regeln und das Hinzufügen einer neuen Regel
funcdef: [decorators] 'def' NAME parameters ['->' test] ':' suite
compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt |
with_stmt | funcdef | classdef
muss geändert werden zu
decorated: decorators (classdef | funcdef)
funcdef: 'def' NAME parameters ['->' test] ':' suite
compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt |
with_stmt | funcdef | classdef | decorated
Das Hinzufügen von decorated ist notwendig, um eine Mehrdeutigkeit in der Grammatik zu vermeiden.
Die Python AST und der Bytecode müssen entsprechend geändert werden.
Eine Referenzimplementierung [3] wurde von Jack Diederich bereitgestellt.
Akzeptanz
Es gab praktisch keine Diskussion nach der Veröffentlichung dieses PEP, was bedeutet, dass alle zustimmten, dass es akzeptiert werden sollte.
Der Patch wurde als Revision 55430 in Subversion eingepflegt.
Referenzen
Urheberrecht
Dieses Dokument wurde gemeinfrei erklärt.
Quelle: https://github.com/python/peps/blob/main/peps/pep-3129.rst
Zuletzt geändert: 2025-02-01 08:59:27 GMT