Schlüsselwörter und eingebaute Bezeichner in Python

PythonBeginner
Jetzt üben

Einführung

In diesem Lab werden Sie die grundlegenden Konzepte der reservierten Wörter (reserved words) und vordefinierten Namen (pre-defined names) von Python erkunden. Zuerst lernen Sie, wie man Python-Schlüsselwörter (keywords) identifiziert, welche spezielle Wörter mit fester Bedeutung sind und nicht als Variablen- oder Funktionsnamen verwendet werden dürfen. Wir werden das eingebaute Modul keyword verwenden, um diese aufzulisten.

Anschließend entdecken Sie die eingebauten Bezeichner (built-in identifiers) von Python, wie Funktionen und Konstanten, die in Ihrem Code immer verfügbar sind. Schließlich werden Sie sehen, warum es entscheidend ist, die Verwendung von Schlüsselwörtern und eingebauten Bezeichnern für Ihre eigenen Namen zu vermeiden, um Fehler zu verhindern und Ihren Code sauber und funktionsfähig zu halten.

Python Schlüsselwörter identifizieren

In diesem Schritt lernen Sie die Python-Schlüsselwörter (Keywords) kennen. Schlüsselwörter, auch reservierte Wörter (reserved words) genannt, sind die grundlegenden Bausteine der Syntax der Sprache. Sie haben eine spezielle Bedeutung und dürfen nicht als Namen für Ihre Variablen, Funktionen oder andere Bezeichner verwendet werden.

Python stellt ein eingebautes Modul namens keyword zur Verfügung, das es einfach macht, alle aktuellen Schlüsselwörter anzuzeigen. Schreiben wir ein Skript, um diese anzuzeigen.

Die notwendige Datei, list_keywords.py, wurde bereits für Sie erstellt. Suchen Sie diese im Dateiexplorer auf der linken Seite der WebIDE und klicken Sie darauf, um sie zu öffnen.

Fügen Sie nun den folgenden Code in die Datei list_keywords.py ein:

import keyword

## Das Attribut kwlist enthält eine Liste aller Schlüsselwörter.
print(keyword.kwlist)

Nach dem Speichern der Datei öffnen Sie das integrierte Terminal in Ihrer WebIDE. Dies können Sie tun, indem Sie im oberen Menü auf Terminal -> New Terminal klicken.

Führen Sie Ihr Skript aus, indem Sie den folgenden Befehl im Terminal eingeben:

python ~/project/list_keywords.py

Die Ausgabe wird eine Liste aller Python-Schlüsselwörter sein.

['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

Es ist wichtig zu beachten, dass diese Wörter reserviert sind. Python unterscheidet zwischen Groß- und Kleinschreibung (case-sensitive), daher ist if ein Schlüsselwort, aber IF nicht. Es ist jedoch bewährte Praxis, die Verwendung jeglicher Variationen von Schlüsselwörtern als Namen zu vermeiden, um die Code-Klarheit zu wahren.

Python eingebaute Bezeichner erkunden

Nun wollen wir die eingebauten Bezeichner (built-in identifiers) von Python untersuchen. Dies sind Namen, die Python für Sie vordefiniert, einschließlich gängiger Funktionen wie print(), Datentypen wie int und str sowie Ausnahmen (exceptions). Sie sind in jedem Python-Skript immer verfügbar, ohne dass eine import-Anweisung erforderlich ist.

Sie können eine Liste aller eingebauten Bezeichner anzeigen, indem Sie die Funktion dir() auf einem speziellen Objekt namens __builtins__ verwenden.

Öffnen Sie die Datei list_builtins.py im Dateiexplorer. Fügen Sie den folgenden Code hinzu:

## dir() gibt eine Liste der Namen im __builtins__-Scope zurück.
print(dir(__builtins__))

Speichern Sie die Datei und führen Sie das Skript im Terminal aus:

python ~/project/list_builtins.py

Sie werden eine lange Liste von Namen in der Konsole ausgegeben sehen. Unten ist eine gekürzte Version der Ausgabe:

['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EncodingWarning', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'aiter', 'all', 'anext', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']

Sie werden viele nützliche Namen in dieser Liste erkennen, wie zum Beispiel len, input, list und dict. In den nächsten Schritten werden wir sehen, warum Sie diese Namen nicht für Ihre eigenen Variablen verwenden sollten.

Vermeiden Sie die Verwendung von Schlüsselwörtern als Bezeichner

In diesem Schritt sehen Sie, was passiert, wenn Sie versuchen, ein Python-Schlüsselwort als Variablenname zu verwenden. Da Schlüsselwörter für die Struktur der Sprache reserviert sind, führt der Versuch, ihnen einen Wert zuzuweisen, dazu, dass das Programm fehlschlägt, noch bevor es ausgeführt wird.

Wir demonstrieren dies, indem wir versuchen, das Schlüsselwort with als Variablennamen zu verwenden.

Öffnen Sie die Datei keyword_error.py im WebIDE-Editor. Fügen Sie den folgenden, absichtlich fehlerhaften Code hinzu:

## Dies wird einen Fehler verursachen, da 'with' ein Schlüsselwort ist.
with = 5
print(with)

Speichern Sie die Datei und versuchen Sie, sie im Terminal auszuführen:

python ~/project/keyword_error.py

Python wird sofort stoppen und einen SyntaxError melden.

  File "/home/labex/project/keyword_error.py", line 2
    with = 5
    ^^^^
SyntaxError: invalid syntax

Die Fehlermeldung SyntaxError: invalid syntax zeigt deutlich an, dass der Code falsch strukturiert ist. Dies geschieht, weil der Python-Interpreter with als Schlüsselwort erkennt, das eine with-Anweisung einleiten sollte, und nicht als einen Namen, der einen Wert speichern kann. Diese Regel gilt für alle Schlüsselwörter, die Sie im ersten Schritt aufgelistet haben.

Vermeiden Sie das Überschreiben eingebauter Bezeichner

Im Gegensatz zu Schlüsselwörtern hindert Python Sie nicht daran, eingebauten Bezeichnern neue Werte zuzuweisen. Dies ist jedoch eine häufige Fehlerquelle und sollte vermieden werden. Wenn Sie einem eingebauten Namen einen neuen Wert zuweisen, "verdecken" Sie dessen ursprüngliche Funktionalität, was zu unerwarteten Fehlern führen kann.

Sehen wir uns an, was passiert, wenn wir die eingebaute print-Funktion überschreiben.

Öffnen Sie die Datei builtin_override.py im WebIDE-Editor. Fügen Sie den folgenden Code hinzu:

## Überschreiben Sie die eingebaute print-Funktion mit einer Ganzzahl (Integer).
print = 5

## Versuchen Sie nun, print() als Funktion zu verwenden.
print("hello")

Speichern Sie die Datei und führen Sie sie im Terminal aus:

python ~/project/builtin_override.py

Dieses Mal beginnt das Skript mit der Ausführung, bricht jedoch mit einem TypeError ab.

Traceback (most recent call last):
  File "/home/labex/project/builtin_override.py", line 5, in <module>
    print("hello")
TypeError: 'int' object is not callable

Der Fehler TypeError: 'int' object is not callable tritt auf, weil sich der Name print nicht mehr auf die eingebaute Druckfunktion bezieht. Stattdessen bezieht er sich auf die Ganzzahl 5. Da man eine Ganzzahl nicht wie eine Funktion "aufrufen" kann (mittels Klammern), stürzt das Programm ab.

Dies verdeutlicht die Gefahr des Überschreibens von Built-ins. Es kann Ihren Code auf nicht offensichtliche Weise beschädigen und die Fehlersuche erschweren. Wählen Sie für Ihre Variablen und Funktionen immer eindeutige, beschreibende Namen, um diese Konflikte zu vermeiden.

Zusammenfassung

In diesem Lab haben Sie zwei wichtige Kategorien von Namen in Python kennengelernt: Schlüsselwörter (Keywords) und eingebaute Bezeichner (Built-in Identifiers). Sie haben das Modul keyword verwendet, um alle reservierten Schlüsselwörter von Python aufzulisten, und gesehen, wie der Versuch, diese als Variablennamen zu verwenden, zu einem SyntaxError führt.

Sie haben sich auch die Liste der eingebauten Bezeichner angesehen und die Probleme untersucht, die entstehen, wenn man diese überschreibt, was zu TypeError und anderen Laufzeitfehlern führen kann. Die wichtigste Erkenntnis ist, immer eindeutige Namen für Ihre Variablen und Funktionen zu wählen und sowohl Schlüsselwörter als auch eingebaute Namen zu vermeiden, um sicherzustellen, dass Ihr Code robust, lesbar und frei von Konflikten ist.