Path: csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail From: Stefan Behnel Newsgroups: de.comp.lang.python Subject: Re: [Python-de] Migration Python 2 auf 3 Date: Fri, 16 Mar 2018 17:05:40 +0100 Lines: 42 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: news.uni-berlin.de iRZoFErSDbBliEchGoHjCQLC63g9vDzbXq9aJWblVA/g== Return-Path: X-Original-To: python-de@python.org Delivered-To: python-de@mail.python.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1521216341; s=strato-dkim-0002; d=behnel.de; h=Content-Transfer-Encoding:Content-Type:In-Reply-To:Date:Message-ID: From:References:To:Subject:X-RZG-CLASS-ID:X-RZG-AUTH; bh=cscPr/jtR06ZCep4Dx3ldZwaxZ82KPio5U1BOYWOXbc=; b=BQPMkVdK6pRHmFUCGOoip6MrtcUgw/7FIqT47PjAvUUmbP4UQ7c7q1sSRMX6eTLmeG zv93lEyiRVRtwGYkYJTcvS62kB0qqhirpxA7hpy5nLDYMaYTt/dIbwAVohfbapfT+yhh 4gClTkzPq5qKxA+vfwU9ftfpN7FB1icLQdxIH4E3sC8KSuQbMZRyRBkmutAPTUvBSb/g Qpz/M85Ka1bSSsvEPL4tWHPDNIpKfmnP5F40DrBM8C8bnc80OxOzhIKtpSpG2g8506gq kg/d6zauxvdwVWVjnKym8o5z69q062LgEfURqM8n4mJak55ZKEj4a0kKRrlXfWB6QIH/ Cm8A== X-RZG-AUTH: :E1MMdFW4b++AXZOTwA41DOYM0Dv9LNWvavC/fJZ6Wfgmp/Lh1ANWCRaaq2R1hCooD/t2Vl9QPVeBUNbEes6Rlw6QSosucbUWfc1WN+9rZt+H2RwU X-RZG-CLASS-ID: mo00 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 In-Reply-To: Content-Language: de-DE X-BeenThere: python-de@python.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: Die Deutsche Python Mailingliste List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Mailman-Original-Message-ID: X-Mailman-Original-References: Xref: csiph.com de.comp.lang.python:5144 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