[Python-de] Migration Python 2 auf 3

Stefan Behnel python-de at behnel.de
Fr Mär 16 12:05:40 EDT 2018


Christopher Arndt schrieb am 16.03.2018 um 15:50:
> Am 16.03.2018 um 15:35 schrieb Philipp Klaus Krause:
>>     m = re.match(r'([^/]*)/([^/]*)/([^/]*)/(.*)$', name)
>>     if (m >= 3):
>>
>> TypeError: '>=' not supported between instances of '_sre.SRE_Match' and
>> 'int'
> 
> Der Python 2 Code benutzt offenbar ein undokumentiertes Verhalten, dass
> die Verwendung eines Regular Expression Match Objects im Integer-Kontext
> zulässt.

Oh, das Verhalten ist durchaus dokumentiert. In Py2 lassen sich alle
Objekte grundsätzlich miteinander vergleichen (sofern das nicht explizit
überschrieben wird). Also auch ein "SRE_Match" Objekt mit dem int-Objekt 3,
was hier wahr ergibt. Das Ergebnis ist definiert und deterministisch, aber
ansonsten an den Haaren herbei gezogen. Und da das None-Objekt einfach mal
standardmäßig kleiner als alle anderen Objekte ist, ist "None >= 3" eben
falsch, so dass die Bedingung falsch wird, wenn der regex-Abgleich
fehlgeschlagen ist. Das ist (vermutlich) hier das gewünschte Verhalten,
aber eben absolut unsinnig ausgedrückt, da es (wie z.B. auch dein Kommentar
zeigt) einen völlig anderen Hintergrund suggeriert.


> Die Semantik dessen kann ich nicht genau sagen, aber ich
> vermute mal, dass es dem Attribut 'lastindex' eines Match Objects
> entspricht.

Nein. Ein "SRE_Match"-Objekt hat keine spezielle Implementierung für den
Wahrheitswert, für Vergleiche, oder für eine Länge. Es ist reiner Zufall,
dass in diesem Fall das Standardverhalten von Objektvergleichen in
funktionierendem Code resultiert. Bei anderen Objekttypen kann das Ergebnis
durchaus anders ausfallen.

Dieses Verhalten war übrigens einer der von Anfang an ganz klaren
Kandidaten für eine Korrektur in Py3, wo verschiedene Objekte jetzt nur
noch auf Gleichheit, aber nicht mehr auf eine Ordnung hin testbar sind.
Also beispielsweise auch nicht mehr einfach so sortierbar in einer
heterogenen Liste. Weil die Fälle, in denen das Bugs produziert, klar die
überwiegen, in denen das Verhalten hilfreich ist.

Stefan


Mehr Informationen über die Mailingliste python-de