1275 Stimmen

Wie erstelle ich eine Konstante in Python?

Wie deklariere ich eine Konstante in Python?

In Java machen wir:

public static final String CONST_NAME = "Name";

4voto

RayLuo Punkte 14410

(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.

3voto

Nqobizwe Punkte 31

Sie können StringVar oder IntVar usw. verwenden, Ihre Konstante ist const_val

val = 'Stackoverflow'
const_val = StringVar(val)
const.trace('w', reverse)

def reverse(*args):
    const_val.set(val)

2voto

André Punkte 814

Alle gegebenen Antworten sind im Wesentlichen zwei Typen:

  1. Erstellen Sie eine Art von Objekt, für das Sie Attribute erstellen können, die einmal definiert nicht geändert werden können.
  2. Verwenden Sie eine Konvention (wie das Schreiben von Konstanten in GROßBUCHSTABEN oder für Python 3.8 verwenden Sie den 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.

  1. Verwenden Sie einen Import-Hook, um die Erstellung eines benutzerdefinierten Moduls zu ermöglichen. Der vielseitige Code, den ich dafür verwende, finden Sie hier.
  2. Erstellen Sie ein spezielles 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.
  3. Das 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.
  4. Um Änderungen der Werte der Konstanten von außerhalb des Moduls zu verhindern (d.h. Monkeypatching), können Sie die __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.

2voto

FMc Punkte 40706

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)

2voto

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.com

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.

Powered by:

X