2017-07-25 12 views
2

Im reference manual wird angegeben, dass:Unterschied zwischen einem geladenen Modul und einem initialisierten Modul?

Ein komplettes Python-Programm wird in einer minimal initialisiert Umgebung ausgeführt: alle eingebauten und Standardmodule zur Verfügung, aber keine initialisiert wurden, mit Ausnahme von sys (verschiedenes System Dienste), builtins (eingebaute Funktionen, Ausnahmen und keine) und __main__.

Ich bin unsicher, was "initialisiert" hier bedeuten soll. Ich habe immer gedacht, dass ein Modul initialisiert wurde, wenn es geladen wurde und in sys.modules:

Dies ist ein Wörterbuch, das Modulnamen zu Modulen abbildet, die bereits geladen wurden.

Anscheinend war ich falsch, weil sys.modules viele andere Module enthält:

python -c "import sys; print(sys.modules.keys() - {'sys', 'builtins', '__main__'})" 
{'_stat', 'encodings.aliases', '_sitebuiltins', '_thread', 'io', '_weakrefset', 'genericpath', 'encodings.utf_8', 'codecs', 'os', '_weakref', '_codecs', '_frozen_importlib', '_io', '_frozen_importlib_external', 'os.path', '_warnings', '_bootlocale', '_signal', 'errno', '_imp', 'encodings.latin_1', 'sysconfig', 'marshal', 'encodings', 'usercustomize', 'site', 'posixpath', '_collections_abc', 'posix', '_sysconfigdata_m_linux_x86_64-linux-gnu', 'encodings.cp437', 'abc', 'zipimport', 'stat', '_locale'} 

Was ist der Unterschied zwischen einem initialisiert und ein geladenes Modul? Ich bin auf Python 3.

Antwort

4

Die Sprachinitialisierung wurde seit der Erstellung der Dokumentation wesentlich komplizierter. (Es ist seit mindestens Python 1.4 weitgehend unverändert.) Alle diese Module in sys.modules sind voll geladen und initialisiert.

+0

Sieht so aus, ziemlich merkwürdig, dass es keine Beachtung gefunden hat, wenn man bedenkt, dass es explizit in den Dokumenten für "import", [speziell für 'modul .__ spec__'] verlinkt ist (https://docs.python.org/3/ referenz/import.html #__ spec__), die vor kurzem aktualisiert wurde. –

+0

Mind auf den "Unterschied zwischen einem initialisierten und einem geladenen Modul" pro Frage erweitern? AFAIK Ein initialisiertes Modul hat seine [Anweisungen ausgeführt] (https://docs.python.org/3.6/tutorial/modules.html#more-on-modules), während ein geladenes Modul nur in der Symboltabelle verfügbar ist. – Alex

+1

@Alex: Die [Systemreferenz importieren] (https://docs.python.org/3/reference/import.html#loading) beschreibt den Ladevorgang so, dass er die Initialisierung umfasst, so dass "geladen" und "initialisiert" werden "sind gleichwertig. Ich würde jedoch von der Python-Dokumentation keine vollständige Konsistenz erwarten; Diese Begriffe, insbesondere "geladen", sollten im Zusammenhang betrachtet werden, um zu bestimmen, was die Dokumente zu sagen versuchen. Zum Beispiel enthält 'sys.modules 'Module, die nicht vollständig in dem Sinne geladen wurden, in dem die Import-Systemdokumente den Begriff verwenden. – user2357112

-1

Um es einfach:

import lädt das Modul in den Speicher.

Wenn Sie eine Klasse im Modul aufrufen und .__init__() funtion so verwenden, dass einige Attribute in der Klasse, die zu diesem Modul gehören, aktualisiert werden, wird dieses Modul zu einem initialisierten Modul.

Beachten Sie, dass bei der Verwendung des Moduls dieser Prozess implizit erfolgt.

TL; DR

import some_module lädt das Modul, some_module.some_attribute/function initialisiert.

+0

Das macht nicht viel Sinn. Was, wenn das Modul keine Klasse hat, würde es dann nie initialisiert werden? Ich fürchte, dass dies ohne Quellen nur Ihre Interpretation von Wörtern ist, die sehr wahrscheinlich aus einem ganz bestimmten Grund verwendet wurden. –

+0

Jedes Modul hat eine eingebaute Klasse. Um dies zu beweisen, versuchen Sie dir (Modul) und Sie werden immer ein Wörterbuch bekommen. Nun, es gibt keine offizielle Definition für "geladen" und "initialisiert". Es ist nur ein Jargon. –

+0

Sie sprechen von einer Klasse * innerhalb * eines Moduls, nicht vom Modulobjekt. Selbst wenn Sie von Modulobjekten sprechen, werden die Module in 'sys.modules 'alle initialisiert, aber das ist nicht im Referenzhandbuch angegeben. Im Referenzhandbuch wird explizit auf 'sys',' builtins' und '__main__' verwiesen. –

Verwandte Themen