module d'importation: NameError: name n'est pas défini
Comment puis-je définir la fonction de l'importateur, de sorte qu'il est visible à l'intérieur importés? J'ai essayé ce
importer.py
est
def build():
print "building"
build()
import imported
En vertu de laquelle, imported.py
est tout simplement
build()
Encore, il échoue
building
Traceback (most recent call last):
File "C:\Users\valentin\Desktop\projects\maxim\miniGP\b01\evaluator\importer.py", line 6, in <module>
import imported
File "C:\Users\valentin\Desktop\projects\maxim\miniGP\b01\evaluator\imported.py", line 1, in <module>
build()
NameError: name 'build' is not defined
Mise à jour Après j'ai eu la réponse à apporter à la circulaire de l'importation, de sorte que l'importation et importés dépendent les uns des autres, je sens que j'ai besoin de préciser qu'il n'est pas toujours bon. Mon but est de préciser certaines stratégie commune dans le module importé. Il va utiliser certaines fonctions définies par l'utilisateur, par exemple build
. L'utilisateur définit la fonction nécessaire(s) et appelle la stratégie. Le point est que la stratégie partagée ne doit pas dépendre d'utilisateur spécifique définitions. Je crois qu'à la place de import
, j'ai besoin de quelque chose comme evaluate(imported.py)
, je crois que c'est une fonction de base dans tous les langages de script, y compris Python. irc://freenode/python insiste sur le fait que je dois utiliser import
mais je ne comprends pas comment.
- Une partie de notre confusion est parce que c'est exactement ce que
import
n', comme un effet secondaire de l'importation du module lui-même. (Donc, sifoo.py
contientbar = 1 + 1
et vousimport foo
, vous avez alors accès àfoo.bar == 2
parce quefoo.py
a été évaluée!) - Je ne comprends pas où la confusion dont vous parlez.
Vous devez vous connecter pour publier un commentaire.
importer.py
imported.py
Noter que les deux importer.py et imported.py doit être dans le même répertoire. J'espère que cela a résolu votre problème
imported.py
avec lefrom importer import build
ligne que vous avez recommandéimporter.py
aussi. Le problème était le manquefrom importer import build
dans leimported.py
. Votre réponse ne résout pas cependant. Je ne peut pas importer de l'importateur parce importés est une pièce commune, qui doivent travailler dans n'importe quel contexte (arbitraire de l'importateur, selon lebuild
fonction qu'il a été défini). Importés ne doivent pas être liés à l'importateur précis.build
, et un seul doit être appelée en fonction d'un certain contexte, vous n'êtes même pas poser la bonne question. Vous avez descendu dans un trou de lapin dans la mauvaise direction. S'il vous plaît, à l'avenir, en fait poser des questions sur le problème auquel vous êtes confronté, pas ce que vous supposer que la réponse sera.why
sans même en précisant ce que vous parlez.Les importations ne sont pas inclut: ils sont idempotents et devrait toujours être au top d'un module.
Il n'y a pas de circularité; une fois
import foo
est vu, d'autres instances deimport foo
ne charge pas le module à nouveau.Vous obtenez la NameError parce que dans le contexte de imported.py, il n'y a pas de nom
build
, il est connu commeimporter.build()
.Je n'ai aucune idée de ce que vous essayez de faire avec le code que bizarrement structuré comme ça.
Je sais que c'est un blasphème, mais la chose qui permet d'importer un module sans lier les importée avec l'importateur est facilement disponible en Python comme langage de script. Vous pouvez toujours évaluer un fichier avec execfile
execfile()
n'est pas de "blasphème", c'est une plaine mauvaise idée. Aussi, il est tout à fait contrairement à l'importation. Il est clair à partir de votre question, c'est ce que vous voulez, mais il n'est pas clair pourquoi vous souhaitez. Ce n'est pas une chose normale à faire en Python, par tous les moyens. La Structure de votre projet pour s'adapter à Python, à la place.