Bindungen und Standardnamen in Python
Unter einem Standardnamen verstehen wir hier einen Namen wie »print«, der von der Standardbibliothek von Python definiert wurde.
Ein Standardobjekt ist ein Objekt, das normalerweise an einen Standardnamen gebunden ist.
Importe
Die Definition eines Namens durch einen Import ähnelt der Bindung eines Namens durch eine Bindungsanweisung.
- Protokoll
from math import pi
pi
3.141592653589793
pi = 2
pi
2
from math import pi
pi
3.141592653589793
Bindungen an Standardobjekte
Das folgende Beispiel zeigt die Bindung einer Funktion an einen neuen Namen »zufallszahl«. Danach kann der neue Name »zufallszahl« wie der bisherige Name »random« verwendet werden.
- Protokoll
from random import random
random()
0.2682902927332
zufallszahl = random
zufallszahl()
0.4239720342875
Dunder -Namen
Dunder -Namen wie »__name__«, die mit zwei Grundstrich »_« beginnen und enden, sind Namen, die von Python für spezielle Zwecke reserviert wurden. Ihre Bindung sollte nur verändert werden, wenn man ihre spezielle Bedeutung auch kennt und versteht.
(Der Name »_« darf jedoch umdefiniert werden. Allerdings wird er von der Konsole immer mit dem Ergebnis der letzten Auswertung einer Eingabe überschrieben.)
Das Umdefinieren von Standardnamen
Programmierer erwarten normalerweise, daß bekannten Namen, wie »print«, eine bestimmte Bedeutung haben.
Tatsächlich können all diese Namen aber an beliebige Objekte gebunden werden.
- Protokoll
print( 2 )
2
random = print
print = 2
print( 2 )
TypFehler: ein int-Objekt ist nicht aufrufbar
random( 2 )
2
print
2
Insofern hat es eigentlich keinen Sinn von „der Funktion ›print‹“ zu sprechen, denn an den Namen »print« kann irgendein beliebiges Objekt gebunden worden sein.
Durch das Löschen des Eintrags in der Bindungstabelle unseres Moduls kann die Python -Sitzung aber wieder repariert werden.
- Protokoll
del print
print
<built-in function print>
Auch ein Name, der normalerweise für eine Klasse steht, kann umgebunden werden.
- Protokoll (übersetzt)
str
<class 'str'>
str = 'a'
str
'a'
Wenn man eine merkwürdige Fehlermeldung erhält, sollte man prüfen, ob man versehentlich einen Standardnamen umgebunden hat!
Beispielsweise will man eine Variable für einen „String“ definieren, und als Name der Variablen fällt einem »str« ein. Man denkt in diesem Moment vielleicht nicht daran, daß »str« ja der Name der Klasse für Zeichenfolgen ist und sein sollte.
Wir gehen in diesem Kurs in der Regel davon aus, daß bekannte (berühmte) Namen, wie »print«, oder Namen aus einem gerade verwendeten Modul die Bindung haben, die sie direkt nach dem Start der Python -Implementation (und nach einem eventuellen Import des Namens aus seinem Modul) haben.
Im speziellen Falle von Namen aus dem Modul »builtins« kann eine Umdefinition auch durch Löschen der neuen Definition verdeckt werden, da diese Neudefinition einen Namen im Modul »__main__« erzeugte, nach dessen Löschen durch weiterhin im Modul »builtins« vorhandene Namen wieder sichtbar wird, der die ganze Zeit unverändert existiert hat.
- Protokoll
print = 2
print( 2 )
TypeError: 'int' object is not callable
del print
print( 2 )
2
Schlüsselwörter
Die Schlüsselwörter »True«, »False« und »None« sind ebenfalls Namen, aber können nicht neu gebunden werden, da sie Schlüsselwörter sind.
- Protokoll (teilweise übersetzt)
True = 5
SyntaxError: Bindung an Schlüsselwörter nicht möglich
Zitate zu Themen dieser Lektion ⃗
- The Python Language Reference, Release 3.8.0a0
2.3.2 Reserved classes of identifiers
Certain classes of identifiers (besides keywords) have special meanings. These classes are identified by the
patterns of leading and trailing underscore characters:_* Not imported by from module import *. The special identifier _ is used in the interactive interpreter
to store the result of the last evaluation; it is stored in the builtins module. When not in interactive
mode, _ has no special meaning and is not defined. See section The import statement.Note: The name _ is often used in conjunction with internationalization; refer to the documentation
for the gettext module for more information on this convention.__*__ System-defined names. These names are defined by the interpreter and its implementation (including
the standard library). Current system names are discussed in the Special method names section and
elsewhere. More will likely be defined in future versions of Python. Any use of __*__ names, in any
context, that does not follow explicitly documented use, is subject to breakage without warning.