2016-05-24 6 views
3

Ich sah nach dem in einem Skript des Schülers, und zu meiner Überraschung funktioniert es:Macht Python bei einem Multi-Segment-Import etwas extra?

>>> import os.path 

Die Frage ist, kurz gesagt, ist: Wie diese verschiedenen von einfachen import os ist? Oder ist es das gleiche, außer dass os.path existiert?

Wie Sie unten sehen können, definiert es nicht path in meinem Bereich, sondern os.

>>> dir() 
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'os'] 

Die Frage ist also: Was macht Python damit? Das Modul os wird importiert (und damit ausgeführt). Es stellt auch sicher, dass os.path zu etwas Gültigem aufgelöst wird. (Danke an @Lee und @Stuart für die Links zu der Dokumentation, die es bestätigt.) Aber gibt es mehr? Oder ist import pkg.submod immer äquivalent zu import pkg (vorausgesetzt, pkg.submod existiert)?

Wenn ich os importiere, importiert/führt es bereits alle Module aus, die os importiert; So ist os.path bereits geladen. Gibt es Vereinbarungen (nicht zu exotisch), bei denen der Import von pkg.submod dazu führen kann, dass anderer Code ausgeführt wird, oder in anderer Reihenfolge oder mit anderen Nebenwirkungen, als nur pkg zu importieren? Und gibt es legitime Anwendungsfälle für das Multi-Segment-Formular? (Um es anders auszudrücken: Was ist der Punkt)

+0

die relevanten Dokumente hier https: //docs.python .org/3.5/tutorial/modules.html # packages – Stuart

+2

Beachten Sie, dass 'os.path' ein Sonderfall ist, da es kein tatsächliches Submodul mit diesem Namen gibt; 'os' selbst importiert' posixpath' oder 'ntpath' als' path'. –

Antwort

3

Von dem docs:

[Der vollständig qualifizierte Name des Moduls] wird in verschiedenen Phasen der Import-Suche verwendet werden, und es kann sein der gepunktete Pfad zu einem Submodul, z foo.bar.baz. In diesem Fall versucht Python ersten foo, dann foo.bar und schließlich foo.bar.baz zu importieren. Wenn einer der Zwischenimporte fehlschlägt, wird ImportError ausgelöst.

Also, Ihre ursprüngliche Frage zu beantworten, so scheint es, dass, wenn os ein gültiges Paket ist, dann ist die ganze Modul importiert wird. So, wie Sie vorschlagen, würde das Untermodul Form verwendet werden, um zu validieren, dass os.path im os Modul vorhanden ist, und nicht nur os.path das Modul importieren.

Wenn Sie wollen nur Import der path Modul, dann können Sie die from ... import ... Syntax:

>>> from os import path 
>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__', 'path'] 

Siehe auch: from … import vs import .

+0

Das ganze Modul ist sicher importiert, leider habe ich nicht klar gemacht, dass ich das wusste. Die Frage ist, welche anderen Effekte es gibt. Gibt es Unterschiede? Wenn ich nur "os" importiere, importiert es nicht schon alles "os" importiert, also auch "Pfad"? – alexis

+0

Ja, ich denke, dass 'import os.path' verwendet werden kann, um zu bestätigen, dass' path' im 'os' Modul existiert, sonst würde es einen' ImportError' auslösen. –

Verwandte Themen