Python 3.15 macht Schluss mit dem None-Ratespiel
Much Ado About None: Sentinel Values in Python
None ist in Python hoffnungslos überladen: Es steht für fehlende Werte, Fehler und echte Daten zugleich. Ein Cache kann nicht unterscheiden, ob ein Schlüssel fehlt oder auf None zeigt. Sentinel-Werte lösen das, indem sie außerhalb des gültigen Wertebereichs liegen. Bisher behalf man sich mit object() oder Enum-Hacks, die Type Checker verwirren. PEP 661 wurde zunächst vertagt, dann akzeptiert: Seit Python 3.15 gibt es den eingebauten sentinel, den Type Checker wie None verengen können.
Sentinel-Werte lösen das, indem sie eine Wache außerhalb des gültigen Wertebereichs sind, sodass sie niemals mit einem tatsächlichen Wert kollidieren können.
- pwdisswordfishq
So viel Aufwand, um die Einführung der optionalen Monade zu vermeiden.
- lpghatguy
Als ich viel Lua geschrieben habe, war ich ein großer Fan davon, einen None-Sentinel-Wert zu haben (Lua verwendet 'nil', um Abwesenheit darzustellen), und es war für viele Dinge nützlich, ähnlich wie Pydantics MISSING.
Diese Unterscheidung ist etwas, das ich tatsächlich praktisch an JavaScript finde, und die Unterscheidung zwischen 'null' und 'undefined' ist aus ähnlichen Gründen manchmal nützlich.
- shepherdjerred
Ich hasse Sentinel-Werte. Auch und gerade bei KI-generiertem Code.
1. Wenn dein Datum keinen Wert hat, gib nicht 0, einen leeren String oder None zurück. Verwende eine diskriminierte Union und modelliere deine Domäne rigoros.
2. Wenn dein Datenmodell None/undefined als Wert akzeptiert, sollte sich das auch in deinem Geschäftsmodell widerspiegeln. Zum Beispiel
3. Mach dein `name`-Feld nicht zu `string | undefined`, nur weil es einen Zwischenlade- oder Verarbeitungszustand geben könnte. Es ist besser, das als etwas wie `Loaded<string>` zu modellieren, wobei Loaded so etwas wie ein Result- oder Optional-Typ ist (obwohl idealerweise strenger definiert).
Hier ist, was ich jahrelang in TypeScript gemacht habe, jetzt aber in einem schönen Paket dank KI: https://github.com/shepherdjerred/monorepo/blob/main/package...
- RantyDave
"Ein einfacher Cache gibt None sowohl für einen fehlenden Schlüssel als auch für einen Schlüssel zurück, der auf None abbildet."
Nein, er gibt KeyError zurück. Oder zumindest sollte er das.
- chowells
Ich mag es. Ich sehe nicht, wie man es besser machen könnte, während man mit Python-Idiomen kompatibel bleibt.