Wie deklariere ich eine Konstante in Python?
In Java machen wir:
public static final String CONST_NAME = "Name";
Wie deklariere ich eine Konstante in Python?
In Java machen wir:
public static final String CONST_NAME = "Name";
(Dieser Absatz war als Kommentar zu den Antworten hier und dort gedacht, in denen namedtuple
erwähnt wurde, aber er wird zu lang, um in einen Kommentar zu passen. Also, hier geht's.)
Der oben erwähnte namedtuple-Ansatz ist definitiv innovativ. Für die Vollständigkeit steht am Ende des Abschnitts NamedTuple in der offiziellen Dokumentation:
Aufgezählte Konstanten können mit benannten Tupeln implementiert werden, aber es ist einfacher und effizienter, eine einfache Klassen-Deklaration zu verwenden:
class Status: open, pending, closed = range(3)
Mit anderen Worten, die offizielle Dokumentation bevorzugt irgendwie einen praktischen Ansatz, anstatt das nur-Lese-Verhalten tatsächlich zu implementieren. Ich denke, es wird ein weiteres Beispiel für den Zen of Python:
Einfach ist besser als komplex.
Praktikabilität schlägt Reinheit.
Alle gegebenen Antworten sind im Wesentlichen zwei Typen:
final
Qualifikator, um anzuzeigen, dass Sie beabsichtigen, dass ein oder mehrere Namen eine Konstante sind.Sie können sagen, "Sie können nicht tun, was Sie mit Python fragen."
Es gibt jedoch tatsächlich eine Möglichkeit, ein Modul mit echten Konstanten zu erstellen. Der Code dafür ist ziemlich kompliziert, und ich werde nur eine Übersicht darüber geben, was erforderlich ist, da er bereits unter einer Open-Source-Lizenz verfügbar ist.
dict
, das das Hinzufügen von Elementen ermöglicht, die Ihrem gewählten Muster entsprechen (zum Beispiel Namen in Großbuchstaben) nur einmal zulässt und verhindert, dass solche Namen ihre Werte geändert bekommen. Dafür müssen Sie Ihre eigenen Methoden wie __setitem__
, __delitem__
usw. definieren. Der Code für ein solches dict (wie er in dieser Datei gefunden wird, die über 250 Zeilen lang ist) ist ungefähr 100 Zeilen lang.dict
für ein normales Python-Modul kann nicht geändert werden. Daher müssen Sie beim Erstellen des Moduls zuerst den Code in Ihrem speziellen dict ausführen und dann den Inhalt verwenden, um das dict des Moduls zu aktualisieren.__class__
des Moduls durch eine benutzerdefinierte mit den neu definierten Methoden __setattr__
und __delattr__
ersetzen.Die Dokumentation zu diesem Beispiel finden Sie hier. Sie sollte wahrscheinlich aktualisiert werden, um die Anzahl der Antworten auf diese Frage widerzuspiegeln.
Ein besseres Vorgehen zur Erstellung von Konstanten in Python besteht darin, sich von der ausgezeichneten attrs-Bibliothek inspirieren zu lassen, die Python-Programmierern dabei hilft, Klassen ohne Boilerplate zu erstellen. Das short-con-Paket bietet dasselbe für Konstanten, indem es eine praktische Wrapper-Funktion um attr.make_class bereitstellt. [Haftungsausschluss: Ich bin der Autor von short-con.]
Werte können explizit entweder über ein dict
oder kwargs
deklariert werden: Diese Beispiele machen dasselbe. Die constants()
-Funktion unterstützt alle Funktionen der Bibliothek, und cons()
ist eine Hilfsfunktion für die einfache Verwendung von kwargs.
from short_con import constants, cons
Pieces = constants('Pieces', dict(king = 0, queen = 9, rook = 5, bishop = 3, knight = 3, pawn = 1))
Pieces = cons('Pieces', king = 0, queen = 9, rook = 5, bishop = 3, knight = 3, pawn = 1)
Für Situationen, in denen die Werte gleich sind wie (oder von) den Attributnamen abgeleitet werden können, ist die Verwendung noch kompakter. Einfach die Namen als Leerzeichen-getrennten String, Liste oder Tuple angeben.
NAMES = 'KING QUEEN ROOK BISHOP KNIGHT PAWN'
xs = NAMES.split()
Pieces = constants('Pieces', NAMES) # Alle davon machen dasselbe.
Pieces = constants('Pieces', xs)
Pieces = constants('Pieces', tuple(xs))
Die namensbasierten Verwendungen unterstützen einige stilistische Konventionen: Groß- oder Kleinschreibung der Attributnamen, zusammen mit Enum-Stil Werten.
Die zugrundeliegenden Werte sind direkt zugänglich, im Gegensatz zu den durch die integrierte enum-Bibliothek erstellten Konstanten:
Pieces.QUEEN # short-con Verwendung
Pieces.QUEEN.value # enum library Verwendung
Und das Objekt ist direkt iterierbar und in andere Sammlungen konvertierbar:
for name, value in Pieces:
print(name, value)
d = dict(Pieces)
tups = list(Pieces)
In Python gibt es keine Konstanten, aber Sie können angeben, dass eine Variable eine Konstante ist und nicht geändert werden darf, indem Sie CONST_
am Anfang des Variablennamens hinzufügen und in einem Kommentar angeben, dass es sich um eine Konstante handelt:
myVariable = 0
CONST_daysInWeek = 7 # Dies ist eine Konstante - ändern Sie ihren Wert nicht.
CONSTANT_daysInMonth = 30 # Dies ist auch eine Konstante - ändern Sie diesen Wert nicht.
Alternativ können Sie eine Funktion erstellen, die wie eine Konstante funktioniert:
def CONST_daysInWeek():
return 7;
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.