from-Importanweisungen in Python
Neben den Modulen »__main__« und »__builtins__« (CPython ) gibt es in Python noch andere Module.
Die Namen, welche in jenen anderen Modulen definiert sind, können aber nicht ohne weiteres verwendet werden. Sie müssen erst in das aktuelle Modul importiert werden.
Zum Importieren kann eine from-Importanweisung verwendet werden, die wir auch kurz als einen from-Import oder Import bezeichnen, wenn dadurch keine Mißverständnisse möglich sind.
Wir behandeln hier zunächst den Import von Namen aus Modulen, die als Teil der Standardbibliothek zu Python gehören.
Beispiel
Das Modul ›string‹ enthält einen Namen »digits«.
Diesen Namen können wir bei Bedarf mit »from« in unser Modul »__main__« importieren und dann als Namen auswerten.
- Protokoll (übersetzt und überarbeitet)
digits
Namensfehler: Der Name 'digits' ist nicht definiert.
from string import digits
digits
'0123456789'
(Die obige Fehlermeldung erscheint unter Umständen erst nach einem Neustart der Python -Implementation [also der Konsole].)
Das Modul ›string‹ sollte nicht mit der Klasse ›str‹ verwechselt werden.
Die Klasse ›str‹ ist der Typ von Zeichenfolgen.
Das Modul ›string‹ enthält Namen, welche die Programmierung (insbesondere in Zusammenhang mit Zeichenfolgen) erleichtern sollen.
Syntax
Die from-Importanweisung beginnt mit dem Wort »from«, diesem folgt ein Name, das Wort »import« und ein weiterer Name.
- Syntaxdiagramm
from-Importanweisung
.----. .------. .------. .------.
--->( from )--->| Name |--->( import )--->| Name |--->
'----' '------' '------' '------'Anweisung
.----------------------.
---.--->| Auswertungsanweisung |---.--->
| '----------------------' |
| .----------------------. |
'--->| from-Importanweisung |---'
'----------------------'
Bisher behandelte Schlüsselwörter: »True«, »False«, »None«, »is«, »in«, »from«, »import«.
Die from-Importanweisung ist die erste „richtige“ Anweisung, die wir kennenlernen. Das heißt, die erste Anweisung, die kein Ausdruck ist. Wie es typisch für alle Anweisungen ist, hat sie keinen Wert.
Trennung lexikalischer Einheiten
Wenn zwei lexikalische Einheiten andernfalls einen einziges Wort bilden würden, müssen sie durch (mindestens) ein Leerzeichen getrennt werden. Daher darf »import string« nicht als »importstring« geschrieben werden (außer man möchte wirklich das Wort »importstring« schreiben, was aber in dieser Lektion keinen Sinn hätte).
Semantik
Mit der Ausführung einer from-Importanweisung wird der Name hinter »import« aus dem Modul, welches durch das Wort hinter »from« angegeben ist, in das Modul, welches jene from-Importanweisung enthält, importiert. Nach solch einem Import kann der importierte Name (vom Ende der Anweisung) als Ausdruck verwendet werden.
- Syntaxdiagramm
from-Importanweisung
.----. .------. .------. .------.
--->( from )--->| Name |--->( import )--->| Name |--->
'----' '------' '------' '------'
Modul Name
Die Ausführung einer from-Importanweisung bezeichnen wird auch kurz als einen from-Import oder Import, wenn dadurch keine Mißverständnisse möglich sind.
Die Bindungstabelle
Jedes Modul hat eine Bindungstabelle. Die Bindungstabelle enthält Attribute (Zeilen). Jedes Attribut besteht aus einem Namen und einem Objekt. Das Objekt gibt den Wert des Namens in dem Modul an. Zu jedem Namen kann es in einer Bindungstabelle höchstens ein Attribut geben,
Beim Import eines Namens aus einem Modul wird das Attribut mit dem Namen aus der Bindungstabelle des importierten Moduls in die Bindungstabelle des importierenden Moduls kopiert. Falls es zuvor schon ein Attribut mit dem importierten Namen im importierenden Modul gab, so wird das bisherige Attribut durch das kopierte Attribut ersetzt.
- Das Kopieren eines Attributs bei »from string import digits« im Modul »__main__«
string __main__
Bindungstabelle Bindungstabelle
| | | | | |
|-----------------|-----------------| |-----------------|-----------------|
| digits | '0123456789' | ----> | digits | '0123456789' |
|-----------------|-----------------| |-----------------|-----------------|
| | | | | |
Durch das Kopieren des Attributs wird das Objekt »'0123456789'« jedoch nicht kopiert. In die zweite Spalte der Bindungstabelle von »__main__« wird nur ein Verweis auf das schon existierende Objekt »'0123456789'« geschrieben. Das bedeutet, daß das Attribut einer neuen Bindung selbst bei einem Objekt, das einen sehr langen Text enthält, nicht besonders viel Speicherplatz verbraucht.
Die Änderung
Auch bei der Ausführung der from-Importanweisung beobachten wir wieder eine Änderung : Nach der Ausführung jener Anweisung kann ein Name, der zuvor möglicherweise nicht ausgewertet werden konnte, unter Umständen ausgewertet werden.
Der Name »_«
Der Name »_« wird nur durch Auswertungsanweisungen umgebunden, deren Ergebnis nicht ›None‹ ist, nicht durch Importanweisungen.
- Konsolenprotokoll
2 + 3
5
_
5
from string import digits
_
5
Standardnamen
Wir nennen Namen, die von der Standardbibliothek definiert werden, Standardnamen, auch wenn sie erst nach der Verwendung eines from-Imports verwendet werden können.
Batterien inklusive
Python kommt „mit Batterien“. Das heißt, daß für viele Anwendungszwecke schon Module in der Standardbibliothek enthalten sind.
Ein Programmierer könnte sich zwar Module auch nach Bedarf beschaffen, jedoch entlastet ihn das Vorhandenseins eines Moduls in der Standardbibliothek von der aufwendigen Auswahl eines Moduls und Analyse der Lizenz des Moduls.
Andererseits belastet eine große Standardbibliothek die Betreuer der Standardbibliothek, die jetzt überarbeitet sind und sich daher eher eine Verkleinerung der Standardbibliothek wünschen. Außerdem können sich Module, sobald sie einmal in die Standardbibliothek aufgenommen wurden, nicht mehr so frei und schnell verändern, wie außerhalb der Standardbibliothek, so daß ihre Weiterentwicklung gebremst wird.
Der Autor dieses Kurses behandelt in seinen Programmierkurses vorwiegend die Standardbibliothek, so daß eine große Standardbibliothek für diesen Kurs bedeutet, daß viele interessante Anwendungsmöglichkeiten vorgestellt werden können.
Einige sehr bekannte Erweiterungsbibliotheken, die in der Standardbibliothek fehlen sind: NumPy, matplotlib, Pandas und PyGame.
Unter »https://pypi.org/« findet man eine große Vielzahl von Erweiterungspaketen. Durch eine Installation mit dem zu CPython gehörenden Programm ›pip‹ kann eine CPython relativ einfach um Erweiterungspakete erweitert werden.
Mehrere Namen aus demselben Modul importieren
Diese Schreibweise zum Import mehrerer Namen aus einem Modul gilt 2020 für PEP8 nicht als schlechter Stil.
- Protokoll
from string import digits, punctuation
digits
'0123456789'
punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
Namen beim Import umbenennen
- Protokoll
from string import digits as d, punctuation as p
d
'0123456789'
p
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
digits
NameError: name 'digits' is not defined
punctuation
NameError: name 'punctuation' is not defined
Python 2 *
Vor vielen Jahren gab es eine Version von Python, die als „Python 2 “ bezeichnet wird. Python 2 hat große Ähnlichkeit mit modernem Python (Python 3 ), so daß man viele Python-2 -Programme (nach eventuell nötigen kleineren Änderungen) leicht mit einer Python-3 -Implementation verwenden kann.
Einige Modulnamen lauteten in Python 2 noch anders. Vollständige Listen findet man im Web. Hier seien nur einige Beispiele aufgezählt.
- Alte und neue Modulnamen (Beispiele)
Python 2 Python 3
Tkinter tkinter
ConfigParser configparser
cPickle pickle
cStringIO, StringIO io
Man sieht, daß für Modulnamen heute vollständige Kleinschreibung bevorzugt wird und auf Voranstellung eines »c« verzichtet wird.
Übungsaufgaben
/ Übungsaufgabe
Ermitteln Sie den Wert des Namens »hexdigits« des Moduls »string« nach dem Import jenes Namens.
/ Reserveaufgabe ⃗
Ermitteln Sie den Wert des Namens »version« des Moduls »sys« nach dem Import jenes Namens.
/ Reserveaufgabe ⃗
Ermitteln Sie den Wert des Namens »ascii_letters« des Moduls »string« nach dem Import jenes Namens.
/ Reserveaufgabe ⃗
Ermitteln Sie den Wert des Namens »punctuation« des Moduls »string« nach dem Import jenes Namens.
- Aussprachehinweise
- punctuation ˌpʌŋkʧuˈeɪʃən
/ Übungsaufgabe
Ermitteln Sie den Wert des Doppelten des Wertes des Namens »pi« aus dem Modul »math« nach dem Import jenes Namens.