HOWTO zu den Konstanten von Python

(C) 2016-2021 T.Birnthaler/H.Gottschalk <howtos(at)ostc.de>
              OSTC Open Source Training and Consulting GmbH
              www.ostc.de

$Id: python-constant.txt,v 1.7 2021/07/28 09:28:40 tsbirn Exp $

Dieses Dokument beschreibt die Konstanten von Python.

--------------------------------------------------------------------------------

Doku --> docs.python.org/3/library/constants.html
         docs.python.org/3/library/builtins.html
         www.python.org/dev/peps/pep-0008

Python kennt eigentlich keine Konstanten, da jedem Bezeichner jederzeit ein
neuer Wert (Objekt) zugewiesen werden kann (der auch nicht vom gleichen
Datentyp sein muss wie der vorher zugewiesene Wert (Objekt)).

Statt dessen wendet Python eine KONVENTION an: Gemäß PEP8 beginnen Konstanten
mit einem GROSSbuchstaben oder sind vollständig GROSS geschrieben. In internen
Bibliotheken wird diese Konvention häufig angewendet, hier einige Beispiele:

  +-------------------------+
  | xml.dom.EMPTY_NAMESPACE |
  | re.IGNORECASE           |
  | csv.QUOTE_ALL           |
  | blake2b.SALT_SIZE       |
  | time.CLOCK_BOOTTIME     |
  | errno.EINTR             |
  +-------------------------+

Einige Konstanten in Bibliotheken werden dennoch klein geschrieben (vermutlich
aus historischen Gründen), hier Beispiele:

  +----------+----------------------------------+
  | math.pi  | Zahl Pi  3.141592653589793       |
  | math.e   | Zahl e   2.718281828459045       |
  | math.tau | Zahl Tau 6.283185307179586       |
  +----------+----------------------------------+
  | math.nan | Ungültige Zahl (Not a number)    |
  | math.inf | Überlauf (Infimum, auch negativ) |
  +----------+----------------------------------+

Es gibt allerdings einige wenige "echte" Konstanten (von vornherein als
Schlüsselwort in die Sprache eingebaut oder mit sonstigen spezielle
Eigenschaften). Bei diesen Bezeichnern verhindert Python die Zuweisung eines
neuen Wertes und meldet den Fehler "SyntaxError".

  +-----------+--------------------------------------------------------------+
  | False     | Logisch "falsch" (bool), entspricht folgenden numerischen    |
  |           |   Werten: 1 (int), 1.0 (float, 1+0j (complex)                |
  | True      | Logisch "wahr" (bool), entspricht folgenden numerischen      |
  |           |   Werten: 0 (int), 0.0 (float, 0+0j (complex)                |
  | None      | Ungültiger Wert (analog dem SQL-Wert "NULL")                 |
  +-----------+--------------------------------------------------------------+
  | __debug__ | True falls Python ohne Option -O (Optimize) gestartet wurde, |
  |           | sonst, False (siehe "assert"-Anweisung)                      |
  +-----------+--------------------------------------------------------------+

Weitere eingebaute Konstanten (deren Änderung aber nicht verhindert wird):

  +----------------+-----------------------------------------------------------+
  | NotImplemented | Nicht implementiert: Spezieller return-Wert bei binären   |
  |                | (inplace) Operatoren, wenn der Operator für den Datentyp  |
  |                | des LINKEN Werts nicht implementiert ist. Es wird dann    |
  |                | der "Reflected"-Operator (z.B. __radd__) für den RECHTEN  |
  |                | Wert aufgerufen). Hat Wert True bzw. 1.                   |
  +----------------+-----------------------------------------------------------+
  | Ellipsis       | Analog Literal "..." (erw. Slicing benutzerdef. Container)|
  +----------------+-----------------------------------------------------------+

Einige Konstanten aus Modulen, die nicht GROSS geschrieben sind (und deren
Änderung auch nicht verhindern wird):

  +------------------+---------------------------------------------------------+
  | quit()           | Abmelden aus Python-Shell                               |
  | exit()           | Abmelden aus Python-Shell                               |
  | copyright        | Python-Copyright                                        |
  | credits          | Python-Danksagung                                       |
  | license()        | Python-Lizenz                                           |
  +------------------+---------------------------------------------------------+
  | sys.version      | Python-Version als String, z.B. "3.8.2 (...)"           |
  | sys.version_info | Python-Version als NamedTuple (major=3, minor=8,        |
  |                  |                micro=2, releaselevel='final', serial=0) |
  +------------------+-----+---------------------------------------------------+
  | string.ascii_letters   | 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQ...Z' |
  | string.ascii_lowercase | 'abcdefghijklmnopqrstuvwxyz'                      |
  | string.ascii_uppercase | 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'                      |
  | string.digits          | '0123456789'                                      |
  | string.hexdigits       | '0123456789abcdefABCDEF'                          |
  | string.octdigits       | '01234567'                                        |
  | string.printable       | '0123456789abcdefghijklmnopqrstuvwxyzABCDEFG...Z' |
  | string.punctuation     | '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'              |
  | string.whitespace      | ' \t\n\r\x0b\x0c'                                 |
  +------------------------+---------------------------------------------------+

HINWEIS: Das Modul "site" wird automatisch geladen und definiert Funktionen
für die interaktive Python-Shell (außer die Option "-S" wurde angegeben).

ACHTUNG: Konstante "NotImplemented" und Fehlermeldung "NotImplementedError"
sind zwei verschiedene Dinge!

HINWEIS: Bei Rückgabe von "NotImplemented" aus einer Magischen Methode "__OP__"
des linken Objekts OBJ1 probiert Python den "Reflected" Operator "__rOP__" für
das rechte Objekt OBJ2 aus, ob dieser ein definiertes Ergebnis liefert.

  OBJ1 = KLASSE1()
  OBJ2 = KLASSE2()
  OBJ1 OP OBJ2    # --> KLASSE1.__OP__(OBJ1, OBJ2) --> NotImplemented?
                  # --> KLASSE2.__rOP__(OBJ2, OBJ1)