Wird uv das Cargo für Python?

(Update 2024-01-16)

uv soll das „Cargo for Python“ werden. Es wird in Rust geschrieben und soll pip und pip-tools ersetzen. Rye wird in dieses Tool integriert – zunächst geht die Betreuung von Rye auf Astral, die Company hinter uv (und auch hinter Ruff!), über.

Um die Umstellung zu erleichtern, kann uv als Drop-in-Replacement für pip, pip-tools und virtualenv verwendet werden. Es soll dabei um Größenordnungen schneller sein. Die Installation ist sehr einfach, da es ein einzelnes Binary ist und keine Python-Abhängigkeiten besitzt. Es genügt ein

curl -LsSf https://astral.sh/uv/install.sh | sh

Das Binary wird dadurch in ~/.cargo/bin/uv installiert. Informationen zu den beiden wichtigsten Subkommandos gibt es mit

uv help venv
uv help pip

Update: Armin Ronacher erklärt, weshalb er Rye in uv eingebracht hat und welche zukünftigen Pläne sich damit verbinden.

Rye ist ein experimenteller, neuartiger Paketmanager

(Update 2024-02-16)

Armin Ronachers neuer Paketmanager rye geht eigene Wege – nach eigener Aussage ist es “An experimental package management solution”.

Rye verwendet nicht das Python des Betriebssystem, sondern lädt eine stand-alone-Instanz herunter und kann deshalb ein Projekt mit quasi beliebiger Python-Version laufen lassen.

Update: Rye wird ein Teil des uv-Projekts – siehe separaten Blog-Post hierzu.

Pyodide, ein WASM-basiertes Python

Pyodide ist ein WASM-basiertes Python, das im Browser abläuft. Es kann als JavaScript per script-Tag in einer Webseite geladen und aufgerufen werden; Python- und JavaScript-Ressourcen sind wechselseitig zugänglich. Mit micropip können (pure-Python sowie einige weitere nach Pyodide portierte) Python-Module eingebunden und dann im Python-Code importiert werden.

Die Demoseite stellt einen Python-REPL zum Ausprobieren bereit.

Task-Orchestrierung für Python

skorche ist ein Tool zur Task-Orchestrierung für Python: Verschiedene Verarbeitungsschritte werden verkettet, dabei können die Daten durch Pipelines laufen, aufgespalten oder zusammengeführt werden und vieles mehr.

beartype: Ein weiterer (Runtime-) Typechecker für Python

Beartype ist ein Python “bare-metal” runtime type checker / enforcer.

Mit den Worten der Entwickler:

Beartype is an open-source pure-Python PEP-compliant near-real-time hybrid runtime-static third-generation type checker emphasizing efficiency, usability, unsubstantiated jargon we just made up, and thrilling puns.

Nach eigenen Angaben induziert Beartype sehr wenig Overhead. Es kann z. B. durch einen Import für einen einzelnen Modul aktiviert werden.

Wie man ein Django-Formular manuell testen kann

Mit etwas Handarbeit kann man oft leichter herausbekommen, warum ein Django-Formular zickt und was da im Hintergrund passiert.

  • myapp.forms oder MyForm von myapp.forms importieren.

  • Wenn es ein ModelForm ist:

    myform = MyForm(instance=some_obj)

    aufrufen, ggf. mit initial=dict(…).

    Wenn es kein ModelForm ist, ohne das instance-Argument.

  • Aus dem Formular die Daten auslesen, die im Template als HTML-<form> gerendert würden:

    post_data = {vf.name: vf.initial for vf in myform.visible_fields()}
    post_data.update({vf.name: vf.initial for vf in myform.hidden_fields()})

    (Die zweite Zeile kann entfallen, wenn es keine hidden fields gibt.)

  • Ggf. post_data verändern, um eine Eingabe zu simulieren. (Erforderliche Felder setzen!)

  • Damit ein gebundenes Formular erzeugen:

    b_myform = MyForm(post_data)
    b_myform.is_valid()

    Wenn is_valid() False liefert, können mit b_myform.errors die Fehler angezeigt werden.

  • Bei einem ModelForm kann das zugehörige Objekt mit b_myform.save() gesichert werden. Will man nicht direkt in die Datenbank schreiben, kann stattdessen

    obj = b_myform.save(commit=False)

    aufgerufen und obj inspiziert werden. Will man es dann doch in die Datenbank bringen, macht man dies mit

    obj.save()
    b_myform.save_m2m()

    (Das letztere Kommando bewirkt nur etwas, wenn das Model ManyToMany-Felder enthält.)

Die Fallstricke von Python datetime

Ein Artikel beschreibt 10 Fallstricke bei der Nutzung von Pythons datetime und was alternative Bibliotheken dagegen unternehmen (oder nicht).

Eine interessante, noch recht neue Alternative zu datetime ist Heliclockter.

Es erlaubt statische Typechecks und unterscheidet sauber, ob Timestamps zeitzonenbezogen sind. Ursprünglich setzte es dazu mit NewType-Definitionen auf datetime auf, ist aber auf eigene Subklassen umgestiegen, um auch Prüfungen zur Laufzeit zu ermöglichen (sofern pydantic aktiv ist).