11
votes

Python "importer" portée

Je traite du code Python généré automatiquement pour moi. Je veux éviter de modifier manuellement ces fichiers python et donc cette question / problème:

foo.py: xxx

boo. Py: xxx

bar.py: xxx

exécution de:

python.exe bar.py

donne une erreur que boo n'a pas trouvé foo . Mais la barre importe les deux foo & boo . Ne devrait pas foo être automatiquement disponible pour boo ?

y a-t-il un moyen de le faire? Comme dit boo.py est généré automatiquement pour moi et je veux éviter d'ajouter l'importe foo to boo.py .

Merci.


0 commentaires

5 Réponses :


5
votes

Non

. Si vous voulez foo code> pour être disponible dans boo code>, vous devez importer dans boo code>. foo import code> qui se trouve dans bar code> ne fait foo code> disponible dans le bar code> module.

En général, un importer code> déclaration en Python est un peu comme une définition variable. On pouvait vraiment penser comme ça: remplacer mentalement p>

import foo
import boo
boo.foo = foo


2 commentaires

D'ACCORD. Merci. J'attendrai encore plus de temps pour que d'autres soient traités. Si quelqu'un a du tour. Sinon - je dois faire ce que je dois faire!


K. Nous allons ajouter manuellement l'importation FOO à ces fichiers PY pour maintenant et réparer l'outil ultérieurement. Parfois, je déteste cette "stricté" de Python mais au fil du temps, comprenez-t-il - c'est généralement la "bonne façon". Merci.



4
votes

Vous devez importer FOO IN BOO

BOO.PY P>

import boo

def bar():
  boo.boo()
  print "bar"


3 commentaires

Les importations circulaires indiquent une erreur de conception.


Et il y a une douleur à résoudre des problèmes lorsque le code est trop serré couplé ... Le refactoring est la seule solution;) C'est pourquoi j'adore Python :)


@Devicko, merci, je dois avoir mal interprété ce fil il y a 6 ans. Soit cela, soit juste mon statuing hors sujet, qui est également crédible ...;)



4
votes

Chaque module a son propre espace de noms. Donc, pour boo.py de voir quelque chose d'un module externe, boo.py doit l'importer lui-même.

Il est possible d'écrire une langue dans laquelle les espaces de noms sont empilés comme vous vous attendez à ce que cela s'attend à ce que cela soit appelé scoping dynamique. Certaines langues comme la LISP d'origine, les premières versions de Perl, PostScript, etc. utilisent (ou support) Scoping dynamique.

La plupart des langues utilisent plutôt un cadre lexical. Il s'avère que c'est une manière beaucoup plus agréable pour les langues de travail: cette façon, un module peut raisonner sur la manière dont il fonctionnera sur son propre code sans avoir à s'inquiéter de la manière dont il a été appelé.

Voir cet article pour plus de détails: http://fr.wikipedia.org/ Wiki / Scope_% 28Programmation% 29


0 commentaires

16
votes

Mais la barre importe à la fois FOO & BOO. Ne devrait pas foo être automatiquement disponible pour boo?

Non, cela ne devrait pas: importer , comme n'importe quel autre moyen de lier un nom, lie ce nom dans une seule portée spécifique, pas "dans tous les champs que vous pouvez éventuellement le vouloir" .

Y a-t-il un moyen de le faire? Comme dit boo.py est automatiquement généré pour moi et je veux éviter d'ajouter l'importation foo to boo.py

Il y a un très mauvais piratage - je ne voudrais pas vivre avec elle (je préférerais beaucoup que mon énergie pour obtenir ce générateur de code totalement brisé qui fait boo.py Correction - s'il a un énorme bogue aussi important qu'il manque une importation cruciale nécessaire, quelles autres horreurs peuvent-elles avoir en magasin ?!), mais, hé, ce n'est pas mon funéraires ... ; -)

avoir bar.py départ ...: xxx

de cette façon, vous avez fait l'identifiant FOO un "faux nom intégré artificiel" (le seul type de nom que est disponible à chaque portée, à moins que l'ombre d'autres liaisons intermédiaires du nom dans des étendues plus proches) se référant au module foo .

non Procédure recommandée, juste une solution de contournement temporaire pour l'horrible bogue flagrant dans le générateur de code que Construit boo.py . Obtenez ce bug fixe afin que vous puissiez retirer ce hack dès que possible!


2 commentaires

D'ACCORD. Je demanderai aux gars d'ajouter manuellement "importer foo" à tous ces fichiers de py. Et je vais résoudre ce problème de génération de .PY plus tard. Merci.


@Alexmartelli j'ai heurté ce piratage et à mes fins, il suffit de cela. Mais je suis toujours perplexe sur toutes les implications de la mise en place de noms dans le __ intégré __ . Outre le problème évident avec les collisions de noms, existe-t-il d'autres pièges remarquables?



0
votes

Vous pouvez utiliser le module ImportLib Une fois qu'un module est importé, il ne peut pas être réimporté, Essayer d'utiliser importer module_name Import ImportLIB

importatlib.reload (Nom de module)

Mais vous devez d'abord importer ce module (Module_Name) et ImportLibIb également.


0 commentaires