Bezeichner-Konventionen (Identifier)        (C) 2017-2024 T.Birnthaler OSTC GmbH
====================================

Doku --> docs.python.org/dev/peps/pep-0008
         www.pep8.org
         docs.python.org/3/reference/lexical_analysis.html
         docs.python.org/3/reference/lexical_analysis.html#keywords
         docs.python.org/3/reference/lexical_analysis.html#identifiers-and-keywords
         docs.python.org/3/reference/grammar.html

BEZEICHNER (IDENTIFIER) in Python gehorchen den üblichen Regeln in jeder
Programmiersprache:

  * Ab 1. Zeichenposition BUCHSTABEN "A-Z" "a-z" und "_" erlaubt
  * Ab 2. Zeichenposition ZIFFERN "0-9" zusätzlich erlaubt
  * Außer UNTERSTRICH "_" keine Sonderzeichen (z.B. Operatoren + - * /) erlaubt
  * LEERZEICHEN nicht erlaubt (Unterstrich "_" dient als Ersatz)

Besonderheiten von Python:

  * Groß/Kleinschreibung wird unterschieden
    (da unter UNIX/Linux üblich und Python unter UNIX/Linux entstanden ist)
  * Punkt "." dient zum Strukturieren von "Qualifizierten" Namen
    (d.h. dem Zugriff auf Namen in anderen Namensräumen)
  * Beim "import" von Modul-Dateien wird der Punkt "." in einen
    Verzeichnis-Trenner (je nach Betriebssystem "\", "/", ":") umgesetzt
  * MODULNAMEN sind gleichzeitig auch Bezeichner von NAMENSRÄUMEN!
    --> DÜRFEN keine Sonderzeichen/Leerzeichen/... enthalten
        (am Besten nur "a-z" und "_" sowie "0-9" ab dem 2. Zeichen!)
    --> Aus Portabilitätsgründen auch auf Groß/Kleinschreibung verzichten
        (nur klein schreiben)

Empfehlung:

  * Alle UNICODE-Buchstaben sind zwar erlaubt (z.B. Umlaute "äöüÄÖÜ" und "ß"
    und griechische/kyrillische Buchstaben, chinesische Schriftzeichen, ...)
    --> Wegen Portabilität/internationaler Verständlichkeit darauf verzichten!

Folgende Konventionen für Bezeichner (Identifier) gelten in Python:

+-----------+------------------------------------------------------------------+
| NAME      | BEDEUTUNG                                                        |
+-----------+------------------------------------------------------------------+
| __xxx__   | INTERNER Name ("dunder name", reserviert für Python selbst)      |
+-----------+------------------------------------------------------------------+
| __xxx     | PRIVATER  Name in Klasse/Objekt (mangled --> _CLASS__xxx)        |
| _xxx      | PROTECTED Name in Klasse/Objekt (im Zshg. mit Vererbung nutzbar) |
| xxx       | PUBLIC    Name in Klasse/Objekt (für alle von außen nutzbar)     |
+-----------+------------------------------------------------------------------+
| self      | Objekt in normaler Methode (1. Standard-Parameter)               |
| other     | Zweites Objekt in 2-wertiger normaler Methode (z.B. "__eq__")    |
| cls       | Klasse in Klassen-Methode (1. Standard-Parameter)                |
+-----------+------------------------------------------------------------------+
| _xxx      | INTERNER Name in MODUL (nur für modulinterne Zwecke gedacht      |
| __xxx     | --> Von "from MODULE import *" nicht importiert                  |
|           | --> Hilfsklasse, Hilfsfunktion, Hilfsvariable, ...               |
| xxx_      | Schlüsselwort als Bezeichner nutzen (z.B. "if_", "for_", ...)    |
+-----------+------------------------------------------------------------------+
| *_        | "Wegwerfvariable" (sammelt beim *-Packing überflüssige Werte)    |
| _         | "Wegwerfvariable" (syntaktisch notwendig, inhaltlich irrelevant) |
| _         | Internationalisierung (i18n, l10n, gettext)                      |
| _         | Ergebnis letzte Auswertung im interaktiven Interpreter ">>>"     |
+-----------+------------------------------------------------------------------+
| *args     | Sammelt restliche POSITIONS-PARAMETER in Funktion (--> Tupel)    |
| **kwargs  | Sammelt restliche KEYWPRD-PARAMETER in Funktion (--> Dictionary) |
+-----------+-------------------+------------------------------+---------------+
| XXX       | Konstante         | TrumpCase Unterstrich Ziffer | Subst Adj --  |
| Xxx       | Klasse/Datentyp   | CamelCase      --     Ziffer | Subst Adj --  |
| XxxError  | Exception         | CamelCase      --     Ziffer | Subst --  --  |
| xxx       | Modul             | SmallCase      --     Ziffer | Subst --  --  |
| xxx_...   | Variable/Attribut | SnakeCase Unterstrich Ziffer | Subst --  --  |
| xxx_...   | Funktion/Methode  | SnakeCase Unterstrich Ziffer | --    --  Verb|
| xxx_...   | Objekt/Instanz    | SnakeCase Unterstrich Ziffer | Subst --  --  |
+-----------+-------------------+------------------------------+---------------+
| NAME      | BEDEUTUNG         | REGEL + ERLAUBTE ZEICHEN     | WORTART       |
+-----------+-------------------+------------------------------+---------------+

camelCase     = EINZELNE Großbst. (zur Strukturierung) + KEIN Unterstrich +
                klein-Bbst. + Ziffern (1. Zeichen klein)
CamelCase     = Analog camelCase (1. Zeichen GROSS statt klein)
PascalCase    = Analog camelCase (1. Zeichen GROSS statt klein)
kebap-case    = Minus "-" statt Unterstrich "_" +  NUR klein-Bbst.
                (in Python nicht möglich)
TRUMPCASE     = NUR GROSS-Bst + Ziffern + KEIN Unterstrich
SCREAMING_SNAKE_CASE = Analog TRUMPCASE + Unterstrich (zur Strukturierung)
smallcase     = NUR klein-Bst + Ziffern + KEIN Unterstrich
snake_case    = NUR klein-Bst + Ziffern + Unterstrich (zur Strukturierung)
Title Case    = 1. Bbst. jedes Wortes GROSS + Rest klein + Leerzeichen als Trennzeichen
                (in Python nicht möglich)
Train-Case    = 1. Bbst. jedes Wortes GROSS + Rest klein + Bindestrich "-" statt Unterstrich "_"
                (in Python nicht möglich)
Sentence case = Analog Title Case (nur 1. Bst. weniger Worte GROSS)
                (in Python nicht möglich)

HINWEIS: Aus historischen Gründen gibt es Ausnahmen bei Konstanten-Benennung:
         (z.B. True, False, None, math.pi, math.e, math.inf, math.nan, ...)
         Ebenso bei der Datentyp/Klassen-Benennung:
         (z.B. bool, int, float, complex, str, tuple, list, set, dict, ...)

QUALIFIZIERTE Namen werden durch "." getrennt (der "." wird beim Zugriff auf
das Dateisystem in den jeweiligen Verz.-Trenner "\" oder "/" umgesetzt).

  MODUL.VARIABLE              # Zugriff auf Variable in Modul
  MODUL.FUNKTION()            # Aufruf von Funktion in Modul
  PAKET.SUBMODUL.VARIABLE     # Zugriff auf Variable in Paket-Untermodul
  PAKET.SUBMODUL.FUNKTION()   # Aufruf von Funktion in Paket-Untermodul
  PFAD.ZU.MODUL.VARIABLE      # Zugriff auf Variable in Modul in Unterverzeichnis
  PFAD.ZU.MODUL.FUNKTION()    # Aufruf von Funktion in Modul in Unterverzeichnis

Komponenten von Klassen und Objekten (Attribute, Methoden) werden ebenfalls
durch "." im Namen angesprochen:

  OBJEKT.ATTRIBUT     # Zugriff auf Attribut von Objekt
  OBJEKT.METHODE()    # Aufruf von Methode für Objekt
  KLASSE.ATTRIBUT     # Zugriff auf Klassen-Attribut
  KLASSE.METHODE()    # Aufruf von Klassen-Methode oder statischer Methode
  FUNKTION.ATTRIBUT   # Zugriff auf Funktions-Attribut


Spezielle Attribute
-------------------
Spezielle Attribute, werden teilweise von der built-in Funktion "dict()" nicht
aufgelistet, wohl aber von der Funktion "dir()".

+------------------+-----------------------------------------------------------+
| Attribut         | Beschreibung                                              |
+------------------+-----------------------------------------------------------+
| __doc__          | Dokumentationsstring ("Docstring")                        |
| __name__         | Name Klasse/Funktion/Methode/Descriptor/Generator-Instanz |
| __qualname__     | Qualifizierter Name Klasse/.../Generator-Instanz          |
| __module__       | Modul in dem Objekt definiert ist                         |
| __all__          | In __init__.py automatisch zu importierende Submodule bei |
|                  |   from MODUL import *                                     |
+------------------+-----------------------------------------------------------+
| __call__         | Code-Objekt einer Funktion                                |
| __defaults__     | Tuple mit Defaultwerten für Position-Parameter von Funk.  |
| __kwdefaults__   | Dictionary mit Defaultwerten für Keyword-Parameter von F. |
| __annotations__  | Dictionary mit Annotations für Param. + Rückgabewert von F|
| __closure__      | Bindungen freier Variablen an Werte zu einer Funktion     |
+------------------+-----------------------------------------------------------+
| __mro__          | Tupel der Basisklassen für Methodenauflösung (linear)     |
| mro()            | Liefert Ergebnis für __mro__ bei Klassen-Instanziierung   |
| __subclasses__() | Liste schwacher Referenzen zu direkten Unterklassen       |
+------------------+-----------------------------------------------------------+
| __class__        | Klasse zu der eine Instanz gehört                         |
| __bases__        | Tupel der Basisklassen eines Klassenobjekts               |
| __dict__         | Speicher für dynamische Objektattribute (Name + Wert)     |
| __slots__        | Namen der statische Objektattribute (__dict__ entfällt)   |
| __weakref__      | "Schwache" Referenzen                                     |
+------------------+-----------------------------------------------------------+
| __globals__      | Referenz zu Dictionary mit globalen Variablen             |
+------------------+-----------------------------------------------------------+
| __self__         | Objekt auf dem eine Methode arbeitet                      |
| __func__         | Funktion die hinter einer Methode steckt (implementiert)  |
+------------------+-----------------------------------------------------------+


Spezielle Methoden