Regeln zu gemischten Ausdrücken in Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@__deets__: Eben doch: undefiniert kann eben auch nicht-deterministisch sein. Da kann das Universum untergehen oder man kann dem Programmierer Dämonen aus der Nase kommen lassen, ohne das man gegen die Sprachbeschreibung verstösst. Und was von beiden man macht, darf man bei jedem Programmlauf auswürfeln. Also so das typische was man eben bei Compilern unter undefiniertes Verhalten versteht. Dagegen ist das Verhalten bei Vergleichen sehr wohl definiert. Und im Gegensatz zum Threading-Verhalten mit dem GIL kann man sich da auch drauf verlassen. Auf das GIL kann man sich nicht verlassen, weil eine Python-Implementierung das nicht haben muss. Das die Vergleiche von unterschiedlichen Typen während eines Programmlaufs konsistent sind, darf man dagegen nicht einfach ändern. Sonst verstösst man gegen die Sprachbeschreibung. Die Implementierungsdetails muss man nicht nachbauen, aber man kann auch anders konsistente Vergleiche implementieren.

@DasIch: Jython ist vielleicht nicht mehr maintained, aber da die Python 2.7 sich eh nicht weiterentwickelt, kann man das durchaus benutzen. Ich habe das im Einsatz für Fälle wo ich auf Java-Bibliotheken angewiesen bin, aber ansonsten die Programmiersprache frei wählen kann. Mittlerweile würde ich da Kotlin bevorzugen, aber bestehenden Code wollte ich erst einmal nicht umschreiben. :-)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Okay, also gilt manchmal: definiertes Verhalten != definiertes Ergebnis bzw undefiniertes Ergebnis != undefiniertes Verhalten. Wenn ein Vergleich unterschiedlicher Typen auf der Speicheradresse beruht, dann ist das nur bedingt robust, da man diese ja nicht beeinflussen kann. Man weiß also nicht, was genau heraus kommt. Aber das Verhalten des Programms ist insofern definiert, dass zumindest das Vorgehen bekannt ist. Hab ich das so richtig verstanden?
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@snafu: Nein, das Vorgehen ist eben nicht bekannt. Es ist aber definiert das es eines gibt das die definierten Eigenschaften garantiert. Nämlich das die Vergleiche während eines Programmlaufs konsistente Ergebnisse liefern, egal wie sie das tun. Das ist definiert. Und damit ist das Ergebnis letztlich ja auch definiert. Mit einem Teil den die Implementierung frei festlegen kann, innerhalb der definierten Grenzen. *Das* ist aber letztlich bei sehr vielen Sachen so.

Zum Beispiel das Ergebnis von `id()`. Das muss eine Zahl liefern, so das bei keinen zwei zur gleichen Zeit existierenden Objekten der gleiche Wert heraus kommt. *Wie* das passiert, kann die Implementierung entscheiden. Das bedeutet ja aber nicht dass das Ergebnis von `id()` undefiniert ist. CPython's `id()` basiert auf der Speicheradresse des Werts. Bei Jython ist es AFAIK einfach ein Zähler. (Das heisst nachdem ca. 2 Milliarden Objekte erzeugt wurden, bekommt Jython ein Problem. :-))

Ebensowenig ist `hash()` exakt definiert. Nur die Randbedingungen die erfüllt werden müssen, und man kann natürlich auch ein wenig gesunden Menschenverstand erwarten.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten