2013-03-07 10 views
9

ich http://docs.python.org/2/tutorial/modules.html#more-on-modules lese und frage mich, ob das folgende korrekt ist:Fehler in Pythons Dokumentation?

Module können andere Module importieren. Es ist üblich, aber nicht erforderlich, alle Importanweisungen am Anfang eines Moduls (oder Skript, für diese Angelegenheit) zu platzieren. Die importierten Modulnamen werden in die globale Symboltabelle des importierenden Moduls eingefügt.

Offensichtlich nicht:

>>> def foo(): import sys 
... 
>>> foo() 
>>> sys.path 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'sys' is not defined 

Siehe http://ideone.com/cLK09v für eine Online-Demo.

Also, ist es ein Fehler in der Python-Dokumentation oder verstehe ich etwas nicht?

+2

Sie können darüber auf http://bugs.python.org berichten. –

+0

@AshwiniChaudhary Fertig: http://bugs.python.org/issue17383 – piokuc

Antwort

12

Ja, das ist ein Dokumentationsfehler. Die import-Anweisung importiert die Namen in den aktuellen-Namespace. Normalerweise wird import außerhalb von Funktionen und Klassen verwendet, aber wie Sie festgestellt haben, funktioniert es in ihnen. In Ihrer Beispielfunktion wird das Modul beim Aufruf der Funktion in den lokalen Namensraum der Funktion importiert. (Was Sie nicht tun, aber das wäre es außerhalb der Funktion nicht verfügbar machen sowieso.)

Der global Begriff hier nicht funktioniert, aber:

def foo(): 
    global sys 
    import sys 

foo() 
sys.path 
0

Ich glaube nicht, dass dies tatsächlich ist ein Fehler in der Dokumentation, aber mehr eine falsche Interpretation. Sie haben einfach ein Problem mit dem Umfang. Sie importieren es im Rahmen der Funktion foo(). Sie könnten sicherlich tun, was die Dokumentation vorschlägt, und den Import am Ende der Datei oder an einer anderen Stelle in der Datei platzieren, die immer noch denselben globalen Gültigkeitsbereich wie Ihr Modul hat. Das Problem ist: "Die importierten Modulnamen werden in die globale Symboltabelle des importierenden Moduls eingefügt", wobei der Bereich des Moduls, in das importiert wird, in der Funktion foo() enthalten ist, nicht auf der globalen Ebene des Moduls.