2017-07-17 2 views
0

Ich bin neu bei Python und entschuldige mich, wenn ich nicht die richtige Umgangssprache benutze, um diese Frage zu schreiben. Ich benutze Python 3.6.1 auf einem Windows-Rechner. Ich gebe ein funktionierendes Beispiel für das Problem, das ich habe.Laden eines Moduls mit einer abhängigen Klasse

Angenommen, ich schreibe ein Modul in der Datei Demo_func.py gespeichert. Es enthält die folgende Funktion:

def chebyshev_nodes(degree, domain): 
    return Chebyshev.basis(degree,domain).roots() 

ich dann das folgende Skript ausführen:

from numpy.polynomial.chebyshev import Chebyshev 
from Demo_func import chebyshev_nodes 

chebyshev_nodes(5, [1,5]) 

es diesen Fehler erzeugt:

NameError: name 'Chebyshev' is not defined

Wenn ich stattdessen die Funktion chebyshev_nodes in meinem Skript schreiben als unten, dann funktioniert es gut.

from numpy.polynomial.chebyshev import Chebyshev 
def chebyshev_nodes(degree, domain): 
    return Chebyshev.basis(degree,domain).roots() 

chebyshev_nodes(5, [1,5]) 

Mein Verständnis ist, dass der Import von Chebyshev global ist. Aber irgendwie funktioniert das in meinem Modul Demo_func. Wie kann ich ein Modul schreiben, das von der Chebyshev-Klasse abhängt?

+1

"Mein Verständnis ist, dass der Import von Chebyshev ist global" - es ist nicht. Die Modulinitialisierung, die es ausführt, ist global, aber es macht nur den Namen "Chebyshev" für den Bereich verfügbar, der den Import durchgeführt hat. – user2357112

+0

Danke, das war hilfreich. Das Importieren von Chebyshev innerhalb der Funktionsdefinition funktioniert. Ist das der richtige Weg, dies zu tun? –

Antwort

-1

Wie Benutzer2357112 in einem Kommentar oben erwähnt, ist das Modul global initialisiert, aber der Name ist nicht. Die Lösung beinhaltet das Laden der Chebyshez-Klasse in die Funktion in der Demo_func.py-Datei.

def chebyshev_nodes(degree, domain): 
    from numpy.polynomial.chebyshev import Chebyshev 
    return Chebyshev.basis(degree,domain).roots() 
+0

Es tut mir leid, aber das ist eine falsche Antwort. Während es funktioniert, gibt es keinen Grund, 'Chebyshev' im Funktionskörper zu importieren. Sie kann und sollte im Rahmen des Moduls 'Demo_func' importiert werden. In diesem Beispiel gibt es kein zirkuläres Importproblem. Daher verschleiern Problemumgehungen wie das Importieren im Funktionskörper nur den Code. Und zirkuläre Importe deuten darauf hin, dass das Projektlayout ohnehin schlecht konzipiert ist. Versteh mich nicht falsch. Ich werde keine andere Antwort geben, um Ansehen zu erlangen. Setze den Import dorthin, wo er sein sollte (weil du es weißt) und dann ändere ich meine -1 in +1. – ElmoVanKielmo

+1

Danke. Ich habe das Antwort-Tag entfernt. Ich denke nicht über den virtuellen Ruf nach. Ich habe eine Antwort gegeben, weil ich es hasse, Dinge ungeschehen zu lassen. Ich bin noch dabei zu lernen, wie Klassen, Bereiche und Namespaces, meist durch Versuche und Fehler. Ich verstehe aus Ihrem Kommentar, dass ich 'Chebyshev' an der Spitze der' Demo_func.py' Datei importieren kann. Es funktioniert und das ist sauberer als du sagst. Ich hatte das schon einmal ausprobiert, aber ich denke, es hat nicht funktioniert, weil ich den Kernel nicht neu gestartet hatte. Lektion gelernt. –

Verwandte Themen