Baumuster x-klasse

Die obigen sehen aus wie Beispiele für Objektkonstruktionen. Ein Konstruktor nimmt einige Werte als Parameter und erstellt ein Objekt aus diesen Komponenten. Aber als Muster bedeuten die obigen den umgekehrten Betrieb des Bauens, das wir Zerstörung nennen: Es nimmt einen Subjektwert und extrahiert seine Komponenten. Die syntaktische Ähnlichkeit zwischen Konstruktion und Zerstörung ist beabsichtigt und folgt dem vorhandenen Python-Stil, der Zuweisungsziele (Schreibkontexte) wie Ausdrücke (Lesekontexte) aussehen lässt. Beim Musterabgleich werden niemals Objekte erstellt, so wie [a, b] = my_list keine neue [a, b]-Liste erstellt oder die Werte von a und b liest. Der Rest des PEP motiviert, warum wir glauben, dass Musterübereinstimmung eine gute Ergänzung zu Python ist, erklärt unsere Design-Entscheidungen und enthält eine präzise Syntaktik und Laufzeitspezifikation. Wir geben auch Anleitungen für statische Typprüfer (und eine kleine Ergänzung zum Tippmodul) und diskutieren die wichtigsten Einwände und Alternativen, die während der ausführlichen Diskussion des Vorschlags sowohl innerhalb der Autorengruppe als auch in der Python-Dev-Community vorgebracht wurden. Schließlich besprechen wir einige mögliche Erweiterungen, die in der Zukunft in Betracht gezogen werden könnten, sobald die Community über ausreichende Erfahrung mit der derzeit vorgeschlagenen Syntax und Semantik verfügt. Literal-Muster verwendet Gleichheit mit Literal auf der rechten Seite, so dass in der obigen Beispielzahl == 0 und dann möglicherweise Zahl == 1, etc.

ausgewertet wird. Beachten Sie, dass technisch negative Zahlen zwar mit unärem Minus dargestellt werden, aber als Literale zum Zweck des Musterabgleichs betrachtet werden. Unary plus ist nicht erlaubt. Binäres Plus und Minus dürfen nur eine reelle Zahl und eine imaginäre Zahl verbinden, um eine komplexe Zahl zu bilden, z. B. 1+1j. Dies hat auch das Problem, dass wir Klammern wünschen oder benötigen, um die Gruppierung in Mustern zu disambiguieren, z. B. in Point(x, y=(y := complex())).

Verwenden Sie das zusammengesetzte Muster, wenn Sie eine baumähnliche Objektstruktur implementieren müssen. Ein Klassenmuster unterstützt die Zerstörung beliebiger Objekte. Es gibt zwei Möglichkeiten, Objektattribute abzugleichen: nach Position wie Point(1, 2) und nach Namen wie Point(x=1, y=2). Diese beiden können kombiniert werden, aber Positionsübereinstimmung kann nicht einer Übereinstimmung nach Namen folgen. Jedes Element in einem Klassenmuster kann ein beliebiges Muster sein. Ein einfaches Beispiel: Dies würde nicht für ODER-Muster funktionieren, die in anderen Mustern verschachtelt sind, wie: Unserer Meinung nach ist der vorgeschlagene Musterabgleich nicht schwieriger als das Hinzufügen von isinstance() und getattr() zum iterablen Auspacken. Außerdem glauben wir, dass die vorgeschlagene Syntax die Lesbarkeit für eine Vielzahl von Codemustern erheblich verbessert, indem sie es ermöglicht, auszudrücken, was man tun möchte, anstatt wie man es tut.

Share