Musterkoffer groß

Da Python eine statementorientierte Sprache in der Tradition von Algol ist und jede zusammengesetzte Anweisung mit einem identifizierenden Schlüsselwort beginnt, schien der Fall am ehesten mit Pythons Stil und Traditionen in Einklang zu stehen. Dieses PEP verallgemeinert diese Anforderung weiter auf beliebige Muster. Eine typische Situation, in der dies gilt, ist das Abgleichen eines Ausdrucks mit einem Union-Typ: Ein Literalmuster besteht aus einem einfachen Literal wie einer Zeichenfolge, einer Zahl, einem booleschen Literal (True oder False) oder None: Wir führen die vorgeschlagene Syntax schrittweise ein. Hier geht es von den Hauptbausteinen aus. Die folgenden Muster werden unterstützt: Dies wird verwendet, um konstanten konstanten und Enumerumwerten zu entsprechen. Jeder gepunktete Name in einem Muster wird mit normalen Python-Namensauflösungsregeln gesucht, und der Wert wird für den Vergleich nach Gleichheit mit dem Übereinstimmungssubjekt verwendet (wie bei Literalen): Wo OOP deutlich überlegen ist, ist im umgekehrten Fall: wo der Satz möglicher Operationen relativ stabil und klar definiert ist, aber es gibt einen ständig wachsenden Satz von Datentypen, auf denen man arbeiten kann. Ein klassisches Beispiel dafür sind UI-Widget-Toolkits, in denen es einen festen Satz von Interaktionstypen gibt (Repaint, Mausklick, Tastendruck usw.), aber der Satz von Widget-Typen wird ständig erweitert, da Entwickler neue und kreative Benutzerinteraktionsstile erfinden. Das Hinzufügen einer neuen Art von Widget ist eine einfache Angelegenheit des Schreibens einer neuen Unterklasse, während Sie bei einem match-basierten Ansatz am Ende eine neue Fallklausel zu vielen weit verbreiteten Match-Anweisungen hinzufügen müssen. Wir empfehlen daher nicht, Match in einer solchen Situation zu verwenden. Hyperscan folgt zwar der libpcre-Syntax, bietet jedoch eine andere Semantik. Die wichtigsten Abweichungen von der libpcre Semantik werden durch die Anforderungen des Streamings und der mehrfachen gleichzeitigen Musterabgleich semantiden. Hyperscan bietet einen experimentellen ungefähren Matching-Modus, der Muster innerhalb einer bestimmten Bearbeitungsentfernung abgleicht.

Das genaue Abgleichsverhalten wird wie folgt definiert: Übereinstimmende Schlüssel-Wert-Paare müssen bereits in der Zuordnung vorhanden sein und dürfen nicht per __missing__ oder __getitem__ erstellt werden. Beispielsweise stimmen collections.defaultdict-Instanzen nur Muster mit Schlüsseln ab, die bereits vorhanden waren, als der Matchblock eingegeben wurde. Es ist oft nützlich, ein Untermuster abzugleichen und den entsprechenden Wert an einen Namen zu binden. Beispielsweise kann es nützlich sein, effizientere Übereinstimmungen zu schreiben oder einfach Wiederholungen zu vermeiden. Um solche Fälle zu vereinfachen, kann jedem Muster (außer dem Walrossmuster selbst) ein Name und der Walrossoperator (:=) vorangestellt werden. Beispiel: Der Betreff muss eine Instanz von collections.abc.Mapping sein. Zusätzliche Schlüssel im Betreff werden ignoriert, auch wenn **rest nicht vorhanden ist. Dies unterscheidet sich vom Sequenzmuster, bei dem zusätzliche Elemente dazu führen, dass eine Übereinstimmung fehlschlägt.

Aber Mappings unterscheiden sich tatsächlich von Sequenzen: Sie haben ein natürliches strukturelles Subtypisierungsverhalten, d.h. das Übergeben eines Wörterbuchs mit zusätzlichen Schlüsseln irgendwo wird wahrscheinlich nur funktionieren. Um einen logischen Kombinationsausdruck zu verwenden, muss er zusammen mit dem HS_FLAG_COMBINATION-Flag an eine der Hyperscan-Kompilierungsfunktionen (hs_compile_multi(), hs_compile_ext_multi()) übergeben werden, die das Muster als logischen Kombinationsausdruck identifiziert.