warum muss scipy optimize hier explizit importieren

07/12/2009 - 15:16 von Jan-Herbert Damm | Report spam
Hallo,

ich habe versucht dieses beispiel http://www.scipy.org/Cookbook/FittingData
nachzumachen. Das Beispiel beginnt mit diesen importen

from pylab import *
from scipy import *

spàter wird optimize.irgendwas aufgerufen, was mir einen NameError bezüglich
optimize eingebracht hat. Nach làngerer Suche habe ich festgestellt, daß es
funktioniert, wenn ich am Anfang optimize zusàtzlich explizit importiere:

from scipy import optimize

Warum ist das so? Habe ich den Packetimport falsch verstanden, oder etwas
zerbrochen?

jan
 

Lesen sie die antworten

#1 Peter Otten
07/12/2009 - 17:08 | Warnen spam
Jan-Herbert Damm wrote:

ich habe versucht dieses beispiel
http://www.scipy.org/Cookbook/FittingData nachzumachen. Das Beispiel
beginnt mit diesen importen

from pylab import *
from scipy import *

spàter wird optimize.irgendwas aufgerufen, was mir einen NameError
bezüglich optimize eingebracht hat. Nach làngerer Suche habe ich
festgestellt, daß es funktioniert, wenn ich am Anfang optimize zusàtzlich
explizit importiere:

from scipy import optimize

Warum ist das so? Habe ich den Packetimport falsch verstanden, oder etwas
zerbrochen?



Wenn wie im Fall von scipy die __init__.py-Datei des Packages ein __all__-
Attribut hat, werden beim Star-Import nur die darin enthaltenen Namen in den
aktuellen Namespace kopiert.

# Nur zu Demonstrationszwecken
import scipy
"optimize" in scipy.__all__






False
from scipy import *
optimize






Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'optimize' is not defined
scipy.__all__.append("optimize")
from scipy import *
optimize






<module 'scipy.optimize' from '/usr/lib/python2.6/dist-
packages/scipy/optimize/__init__.pyc'>

Wenn __init__.py kein __all__-Attribut besitzt, werden alle darin
enthaltenen Namen kopiert, die nicht mit _ beginnen. scipy/__init__.py muss
dann also das Statement

import optimize

enthalten, damit der Star-Import wie von Dir gewünscht funktioniert. Das
erhöht die Ladezeit und den Speicherbedarf und ist nur bei hàufig
verwendeten Untermodulen üblich (os.path).

Peter

Ähnliche fragen