2016-07-01 19 views
1

Meine Frage ist spezifisch für Scikit-lernen Python-Modul, aber ich hatte ähnliche Probleme mit Matplotlib ebenso.Importieren von ganzen Python-Modul erlaubt nicht die Verwendung von Submodulen

Wenn ich sklearn verwenden möchte, wenn ich nur sklearn 'importiere und dann jedes Submodul, das ich brauche, wie' sklearn.preprocessing.scale() 'aufrufen, bekomme ich einen Fehler "AttributeError:' Modul 'Objekt hat kein Attribut 'Vorverarbeitung' "

Auf der anderen Seite, wenn ich 'von sklearn importieren Vorverarbeitung' und dann 'preprocessing.scale()' funktioniert es normal.

Wenn ich andere Module wie Numpy benutze, ist es ausreichend, einfach "numpy" zu importieren und es funktioniert gut.

Daher würde ich gerne fragen, ob mir jemand sagen kann, warum passiert das und wenn ich etwas falsch mache?

Danke.

+0

[Diese Antwort] (http://stackoverflow.com/a/9049246/4014959) kann hilfreich sein. –

+0

Das vorgeschlagene Duplikat, http://stackoverflow.com/questions/9048518/importing-packages-in-python, fragt nach "Wie strukturiere ich mein eigenes Paket, um alles zu importieren". Hier geht es um das Verhalten von 'scikit-learn'. – hpaulj

+0

http://stackoverflow.com/questions/27744767/differences-in-importing-modules-subpackages-of-numpy-and-scipy-packages ist ein besseres Duplikat, da es sich auf den Unterschied zwischen "numpy" und "scipy" konzentriert '. 'scipy' wie' scikit-learn' erfordert das individuelle Importieren von Submodulen. – hpaulj

Antwort

1

Numpy importiert seine Submodule bequem in die Datei __init__.py und fügt sie zu __all__ hinzu. Es gibt nicht viel, was Sie tun können, wenn Sie eine Bibliothek benutzen - es tut es entweder oder nicht. sklearn scheint das nicht zu tun.

1

Ein Python-Paket ist in der Datei __init__.py innerhalb des Verzeichnisses definiert. Diese Datei bestimmt, ob Submodule enthalten sind. Wenn Sie import sklearn tun, findet Python die Datei sklearn/__init__.py und führt sie aus, um das sklearn-Modul zu erstellen. Dieses Objekt ist an den Namen sklearn gebunden. Submodule werden nicht implizit vom Interpreter importiert.

Wenn Sie jedoch from sklearn import preprocessing tun, lädt Python zuerst das sklearn Modul wie zuvor. Dann wird es prüfen, ob preprocessing ein Attribut dieses Moduls ist (z. B. eine Funktion), und wenn nicht, wird es nach der Datei sklearn/preprocessing.py suchen und dieses Modul ebenfalls imprtieren.

Es kommt vor, dass numpy tut so etwas wie die folgenden in seiner __init__.py Datei:

import .random 

So, wenn sie als import numpy die Ausführung dieses Modul einge numpy löst den Import von numpy.random, die dann als Attribut hinzugefügt wird.


Dies ist nützlich, weil man manchmal nur Teil eines Pakets verwenden mag, und all das Laden eine erhebliche Menge an Zeit in Anspruch nehmen könnte. Zum Beispiel Importieren numpytut nehmen Sie etwas wie eine halbe Sekunde. Dies ist Zeitverschwendung, wenn Sie nur eine sehr kleine Teilmenge seiner Funktionalität benötigen.


Sie könnten daran interessiert sein, die documentation for packages zu lesen.