Was ist neu in Python 3.8?#

In Python 3.8 vereinfacht sich die Syntax und auch die Unterstützung für C-Bibliotheken verbessert sich. Im Folgenden erhaltet ihr ein kurzer Überblick über einige der neuen Features. Einen vollständigen Überblick erhaltet ihr in What’s New In Python 3.8.

Installation#

Überprüfen#

[1]:
!python3 -V
Python 3.8.0

or

[2]:
import sys


assert sys.version_info[:2] >= (3, 8)

Assignment Expressions: Walrus operator :=#

Bisher wurde z.B. von pip env_base folgendermaßen ermittelt:

[3]:
import os
[4]:
def _getuserbase():
    env_base = os.environ.get("PYTHONUSERBASE", None)
    if env_base:
        return env_base

Dies kann nun vereinfacht werden mit:

[5]:
def _getuserbase():
    if env_base := os.environ.get("PYTHONUSERBASE", None):
        return env_base

Auch lassen sich mehrfach verschachtelte if vermeiden, wie z.B. in cpython/Lib/copy.py. Aus

[6]:
from copyreg import dispatch_table
[7]:
def copy(x):
    cls = type(x)
    reductor = dispatch_table.get(cls)
    if reductor:
        rv = reductor(x)
    else:
        reductor = getattr(x, "__reduce_ex__", None)
        if reductor:
            rv = reductor(4)
        else:
            reductor = getattr(x, "__reduce__", None)
            if reductor:
                rv = reductor()
            else:
                raise Error(
                    "un(deep)copyable object of type %s" % cls)

wird dann:

[8]:
def copy(x):
    cls = type(x)
    reductor = dispatch_table.get(cls)
    if reductor := dispatch_table.get(cls):
        rv = reductor(x)
    elif reductor := getattr(x, "__reduce_ex__", None):
        rv = reductor(4)
    elif reductor := getattr(x, "__reduce__", None):
        rv = reductor()
    else:
        raise Error("un(deep)copyable object of type %s" % cls)

Positional-only-Parameter#

In Python 3.8 kann mit / ein Funktionsparameter positionsbezogen angegeben werden. Etliche Python-Funktionen, die in C implementiert sind, erlauben keine Keyword-Argumente. Dieses Verhalten kann nun in Python selbst emuliert werden, z.B. für die pow()-Funktion:

[9]:
def pow(x, y, z=None, /):
    "Emulate the built in pow() function"
    r = x ** y
    return r if z is None else r%z

f-strings unterstützen = für sich selbst dokumentierende Ausdrücke und Debugging#

[9]:
user = "veit"
member_since = date(2012, 1, 30)
f"{user=} {member_since=}"
user='veit' member_since=datetime.date(2012, 1, 30)

Debug- und Release-Build verwenden dasselbe ABI#

Bisher sollte durch Spack ein konsistentes Application Binary Interface (ABI) gewährleistet werden. Dies schloss jedoch nicht die Verwendung von Python im Debug-Build ein. Python 3.8 unterstützt nun auch für Debug Builds die ABI-Kompatibilität. Das Py_TRACE_REFS-Makro kann nun gesetzt werden mit der ./configure --with-trace-refs-Build-Option.

Neue C-API#

Mit PEP 587 kommt eine neue C-API zum Konfigurieren der Python-Initialisierung hinzu, die eine genauere Steuerung der gesamten Konfiguration und bessere Fehlerreports bietet.

Vectorcall – ein schnelles Protokoll für CPython#

Momentan ist das Protokoll noch nicht vollständig implementiert; dies wird wohl erst mit Python 3.9 kommen. EIne vollständige Beschreibung erhaltet ihr jedoch jetzt bereits in PEP 590.

Update – oder nicht?#

Im Folgenden findet ihr eine kurze Übersicht über Probleme, die beim Wechsel zu Python 3.8 auftreten können:

Fehlende Pakete#

Bugs#

  • Python 3.7.1 wurde 4 Monate nach dem ersten Major Release mit einer langen Liste von Bugfixes veröffentlicht. Ähnliches ist auch bei Python 3.8 zu erwarten.

Syntax#

  • Die wenigsten Code-Analyse-Werkzeuge und Autoformatter können bereits die Syntax-Änderungen von Python 3.8

Warum dennoch updaten?#

Da das Upgrade einige Zeit in Anspruch nehmen wird, kann es verlockend sein, den Wechsel auf unbestimmte Zeit zu verschieben. Warum sollten Sie sich mit Inkompatibilitäten neuer Versionen beschäftigen, wenn eure aktuelle Version zuverlässig funktioniert?

Das Problem ist, dass eure Python nicht auf unbestimmte Zeit unterstützt wird und auch die von euch verwendeten Bibliotheken nicht alle älteren Python-Versionen auf unbestimmte Zeit unterstützen wird. Und je länger ihr ein Update hinauszögert, umso größer und risikoreicher wird es. Daher empfiehlt sich das Update auf die neue Major Version von Python üblicherweise einige Monate nach dem ersten Release.

Portierung#