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: em> p> boo. Py: em> p> bar.py: em> p> exécution de: P> python.exe bar.py p>
blockQuote> donne une erreur que y a-t-il un moyen de le faire? Comme dit boo.py em> est généré automatiquement pour moi et je veux éviter d'ajouter l'importe foo to boo.py em>. P> Merci. P> p>
boo code> n'a pas trouvé foo code>. Mais la barre importe les deux foo code> & boo code>. Ne devrait pas foo code> être automatiquement disponible pour boo code>? P>
5 Réponses :
Non
. Si vous voulez En général, un 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. 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
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.
Vous devez importer FOO IN BOO
BOO.PY P>
import boo def bar(): boo.boo() print "bar"
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 ...;)
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. p>
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. P>
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é. P>
Voir cet article pour plus de détails: http://fr.wikipedia.org/ Wiki / Scope_% 28Programmation% 29 P>
Mais la barre importe à la fois FOO & BOO. Ne devrait pas foo être automatiquement disponible pour boo? p>
Non, cela ne devrait pas:
importer code>, 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" . P>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 p> blockQuote>
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 code > 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 em> funéraires ... ; -) p>avoir
bar.py code> départ ...: p>xxx pré> de cette façon, vous avez fait l'identifiant
FOO code> un "faux nom intégré artificiel" (le seul type de nom que est fort> 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 modulefoo code>. p>
non forte> 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 code>. Obtenez ce bug fixe em> afin que vous puissiez retirer ce hack dès que possible! p> blockQuote>
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é __ code>. Outre le problème évident avec les collisions de noms, existe-t-il d'autres pièges remarquables?
Vous pouvez utiliser le module ImportLib
Une fois qu'un module est importé, il ne peut pas être réimporté,
Essayer d'utiliser
Mais vous devez d'abord importer ce module (Module_Name) et ImportLibIb également. P>
blockQuote> importer module_name code>
Import ImportLIB code> p>
importatlib.reload (Nom de module) code> p>