HOWTO · Python

Konstanten in Python

Erfahren Sie, wie Sie Python-Konstanten mit UPPER_CASE-Namen definieren, verwandte Werte gruppieren und Enum für feste Mengen verwenden.

Auf dieser Seite

Python besitzt keine const-Deklaration, die einen Namen dauerhaft schreibgeschützt macht. Üblicherweise definieren Sie einen Namen auf Modulebene mit der Schreibweise UPPER_CASE und behandeln eine Neuzuweisung als Fehler bei der Codeüberprüfung. Verwenden Sie eine Klasse zum Gruppieren oder Enum, wenn die Werte eine feste Menge benannter Mitglieder bilden.

Konstanten auf Modulebene mit UPPER_CASE-Namen definieren

Platzieren Sie gemeinsam genutzte Werte nahe dem Anfang des Moduls und schreiben Sie ihre Namen mit Großbuchstaben und Unterstrichen. Andere Module können den Namen normal importieren. Diese Konvention vermittelt die Absicht, aber Python erlaubt weiterhin, den Namen neu zu binden.

TIMEOUT_SECONDS = 30
SUPPORTED_FORMATS = ("json", "toml")

print(TIMEOUT_SECONDS)
TIMEOUT_SECONDS = 60  # Legal Python, but a reassignment of a constant by convention.
print(TIMEOUT_SECONDS)

Ausgabe:

30
60

Das Tupel verhindert Änderungen an diesem Tupelobjekt, macht den Modulnamen aber nicht unveränderlich: SUPPORTED_FORMATS kann weiterhin neu gebunden werden. Ebenso kann eine veränderliche Liste direkt geändert werden. Wählen Sie nach Möglichkeit unveränderliche Werte und halten Sie Konstanten in einem Modul, wenn sie Teil seiner öffentlichen Konfiguration oder API sind.

Zusammengehörige Werte mit einer Klasse gruppieren

Eine Klasse kann einen lesbaren Namensraum für Werte bereitstellen, auf den Sie als Settings.DEFAULT_TIMEOUT zugreifen. Das ist nützlich, aber ein normales Klassenattribut ist keine von der Sprache erzwungene Konstante. Sowohl die Klasse als auch (üblicherweise) ihre Instanzen können geändert werden.

class Settings:
    DEFAULT_TIMEOUT = 30
    RETRY_LIMIT = 3


print(Settings.DEFAULT_TIMEOUT)
Settings.DEFAULT_TIMEOUT = 60
print(Settings.DEFAULT_TIMEOUT)

Ausgabe:

30
60

Deskriptoren oder Metaklassen können ausgewählte Zuweisungen ablehnen, erhöhen aber die Komplexität und erfordern weiterhin eine sorgfältige Behandlung von Instanzattributen, Vererbung und anderen Änderungswegen. Verwenden Sie eine gewöhnliche Klasse daher als Namensraum, außer Sie benötigen eine getestete, ausdrücklich geforderte Durchsetzung.

Enum für eine feste Menge benannter Werte verwenden

Verwenden Sie das Standardbibliotheksmodul enum, wenn ein Wert eines von definierten Mitgliedern sein muss. Auf ein Enum-Mitglied wird über die Klasse zugegriffen, und die Zuweisung eines neuen Mitgliedswerts löst eine Ausnahme aus. Enum passt besser als eine Großbuchstabenvariable, wenn die Menge eine fachliche Bedeutung hat, etwa Zustände, Farben oder Modi.

from enum import Enum


class Color(Enum):
    RED = "red"
    BLUE = "blue"


print(Color.RED.value)
try:
    Color.RED = "green"
except AttributeError as error:
    print(type(error).__name__)

Ausgabe:

red
AttributeError

Enum macht nicht jeden Wert unveränderlich und ist nicht mit den ursprünglichen Zeichenfolgewerten austauschbar. Verwenden Sie Color.RED, wenn die Mitgliedsidentität wichtig ist, oder Color.RED.value, wenn eine API den zugrunde liegenden Wert benötigt. Zum Parsen externer Eingaben erstellen Sie das Enum mit Color("red"); ein unbekannter Wert löst ValueError aus.

Namedtuples und Funktionen als Alternativen betrachten

Die ältere Technik collections.namedtuple() kann unveränderliche Felder gruppieren: Constants = namedtuple("Constants", "PI E") und anschließend values = Constants(3.14159, 2.71828) erzeugen ein Tupel, dessen Felder nicht zugewiesen werden können. Das ist nützlich für einen leichten Datensatz, aber für benannte Auswahlmöglichkeiten weniger ausdrucksstark als Enum.

Eine Funktion, die einen Wert zurückgibt, kann die Erstellung verbergen oder einen Wert bei Bedarf berechnen, ist aber keine Konstantendeklaration. def api_version(): return "v1" vermittelt einen Zugriff, keine unveränderliche Bindung. Bevorzugen Sie einen Namen auf Modulebene für eine einfache Konstante, eine Klasse zur Gruppierung und Enum für eine geschlossene Menge von Mitgliedern.

Muster auswählen und überprüfen

Verwenden Sie UPPER_CASE-Namen auf Modulebene für gewöhnliche Werte, eine Klasse, wenn ein Namensraum die Organisation verbessert, und Enum für eine feste Fachmenge. Machen Sie die Änderungsgrenze deutlich: Gewöhnliche Namen und Klassenattribute können neu gebunden werden, während Enum-Mitglieder eine Neuzuweisung ablehnen. Die Beispiele überprüfen erfolgreichen Zugriff und das wichtige Fehlverhalten. Codeüberprüfungen, Tests und klare APIs bleiben Teil der Durchsetzung eines konstanten Designs.

Zusammenfassung

Python bietet kein eingebautes Schlüsselwort const. Definieren Sie gewöhnliche Konstanten mit UPPER_CASE-Namen auf Modulebene, gruppieren Sie verwandte Konstanten bei Bedarf mit einer Klasse und wählen Sie Enum, wenn Aufrufer eine von mehreren benannten Mitgliedern verwenden sollen. Betrachten Sie namedtuple() und Funktionszugriffe als spezialisierte Alternativen, nicht als erzwungene Konstanten.