2009-07-11 10 views
1

OK, also weiß ich, dass from-import ist "genau" das gleiche wie import, außer dass es offensichtlich nicht, weil Namespaces unterschiedlich belegt sind.Führt "from-import" das gesamte Modul aus?

Meine Frage ist in erster Linie motiviert, weil ich ein utils Modul habe, das eine oder zwei Funktionen hat, die von jedem anderen Modul in meiner App verwendet werden, und ich arbeite an der Aufnahme der Standardbibliothek logging Modul, die soweit ich kann sagen, dass ich sorta wie dies tun müssen:

import logging 
logging.basicConfig(filename="/var/log") # I want file logging 

baselogger = logging.getLogger("mine") 
#do some customizations to baselogger 

und dann zu verwenden, in einem anderen Modul würde ich die Protokollierung wieder importieren:

import logging 
logger = logging.getlogger("mine") 

# log stuff 

Aber was ich will, ist wissen, ob ich tun from utils import awesome_func wird mein Logger definitiv eingerichtet, und wird das Logging-Modul so eingerichtet, wie ich es möchte?

Dies würde auch für andere generische Setups gelten.

Antwort

5

Sieht aus wie wie die Antwort lautet ja:

$ echo 'print "test" 
def f1(): 
    print "f1" 

def f2(): 
    print "f2" 

' > util.py 

$ echo 'from util import f1 
f1() 
from util import f2 
f2() 
' > test.py 

$ python test.py 
test 
f1 
f2 

$ 
+0

Danke. Wenn Sie dies genauer mit einem wirklich kleinen Testprotokollierungsmodul tun, zeigt dies, dass es korrekt initialisiert wird. – quodlibetor

1

Ja, from MODULE import OBJECT führt alles im Modul aus und macht dann effektiv OBJECT = MODULE.OBJECT. Sie können feststellen, dass das Modul bereits in gewisser Weise geladen wurde, da es jetzt im sys.modules Wörterbuch liegt.

6

Die Antwort auf Ihre Frage ist ja.

Für eine gute Erklärung des Importvorgangs, siehe Frederik Lundhs "Importing Python Modules".

Insbesondere zitiere ich die Abschnitte, die Ihre Abfrage beantworten.

Was macht Python, um ein Modul zu importieren?

[...]

  1. Erstellen Sie ein neues, leeres Modul-Objekt (das im Wesentlichen ein Wörterbuch ist)
  2. Legen Sie das Modul Objekt im sys.modules Wörterbuch
  3. laden das Modul Code Objekt (ggf. kompilieren Sie das Modul zuerst)
  4. Führen Sie das Modul-Code-Objekt im Namensraum des neuen Moduls aus. Alle durch den Code zugewiesenen Variablen sind über das Modulobjekt verfügbar.

und über die Verwendung von from-import:

Es gibt viele Möglichkeiten, ein Modul zu importieren

[...]

von X Import a, b, c importiert das Modul X und erstellt Verweise im aktuellen Namespace auf die angegebenen Objekte.Oder mit anderen Worten, Sie können jetzt a und b und c in Ihrem Programm verwenden.

Hinweis Ich habe eine Sache vergessen. Es lohnt sich, das gesamte Dokument zu lesen, es ist eigentlich ziemlich kurz.

+0

Danke, ich hatte das gelesen, bevor ich meine Frage gestellt habe, aber ich habe nicht das Gefühl, dass "von X Import a, b, c" Abschnitt ist genau klar. Weil es das Modul nicht genau wie im obigen Abschnitt importiert. Aber basierend auf all den anderen zur Verfügung gestellten Belegen ist es sicherlich nahe genug. – quodlibetor

0

Wie oben erwähnt, ja. Und Sie können einfacher Test schreiben sicher sein:

# file m.py 
import sys 

# define function 
def f(): 
    pass 

#execute this when module is loaded (i.e. imported or run as script) 
print 'imported', __name__ 
# print all "exposed" variables to make sure that the f is visible 
print dir(sys.modules[__name__]) 

# file main.py 
from m import f 
print 'done' 

I funktioniert jedes Mal, wenn Sie im Zweifel sind solche Tests wie einige Import oder Unterklassen oder thomething anderes Schreiben empfehlen.

Verwandte Themen