Rechargement dans l'interpréteur Python
$ python
>>> import myapp
>>> reload(myapp)
<module 'myapp' from 'myapp.pyc'>
>>>
ctrl+D
$ python
>>> from myapp import *
>>> reload(myapp)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'myapp' is not defined
Pourquoi il se comporte différemment? Comment puis-je recharger lors de l'utilisation de from myapp import *
?
La raison que j'utilise reload() est parce que j'ai changer le code source du module et de le tester et la raison que j'utilise à partir de myapp import est parce qu'il me permet de gagner de la frappe.
Merci pour les conseils, mais je ne peux pas imaginer ce sans exemple. Si c'est possible, et vous avez le temps d'écrire plus à ce sujet, s'il vous plaît mettre quelques exemple d'une réponse. Ou je peux créer une nouvelle question en fonction de votre commentaire, si vous n'êtes pas contre elle.
Je voulais dire quelque chose comme pastie.org/3844991. Au lieu d'avoir une coque ouverte et essayer de recharger des trucs (qui ne peut pas fonctionner correctement), vous pouvez simplement recharger la coque entière à partir de zéro à l'aide de ce script. Cela a aussi l'avantage de forcer explicitement d'installation le contexte que vous souhaitez tester, de sorte que vous pouvez reproduire tout ce que vous faites et ont la possibilité de transformer cela en une unité de test facilement plus tard.
Merci beaucoup, très bonne idée.
reload
est pour être utilisé avec un beaucoup de prudence. Il se comporte d'inattendu dans de nombreux égards, le pire est que les classes existent dans de nombreuses versions à l'intérieur de la VM, selon si vous avez de vieilles instances de reloaded classes de traîner. reload
a été retiré de Python 3 pour cette raison. Souvent, il est beaucoup plus facile à mettre en place un petit script de configuration de tous les modules dont vous avez besoin, puis déposez-les dans un shell à l'aide de import code; code.interact(local=locals())
. L'interpréteur Python démarre très vite, donc ce n'est généralement encore plus rapide, puis la recherche de reload
dans la readline l'histoire.Merci pour les conseils, mais je ne peux pas imaginer ce sans exemple. Si c'est possible, et vous avez le temps d'écrire plus à ce sujet, s'il vous plaît mettre quelques exemple d'une réponse. Ou je peux créer une nouvelle question en fonction de votre commentaire, si vous n'êtes pas contre elle.
Je voulais dire quelque chose comme pastie.org/3844991. Au lieu d'avoir une coque ouverte et essayer de recharger des trucs (qui ne peut pas fonctionner correctement), vous pouvez simplement recharger la coque entière à partir de zéro à l'aide de ce script. Cela a aussi l'avantage de forcer explicitement d'installation le contexte que vous souhaitez tester, de sorte que vous pouvez reproduire tout ce que vous faites et ont la possibilité de transformer cela en une unité de test facilement plus tard.
Merci beaucoup, très bonne idée.
OriginalL'auteur xralf | 2012-05-01
Vous devez vous connecter pour publier un commentaire.
De http://docs.python.org/library/functions.html#reload :
Donc, vous devriez faire quelque chose comme:
OriginalL'auteur aland
Avec
from myapp import *
, vous n'avez pas de référence à votre module dans un nom de variable, de sorte que vous ne pouvez pas utiliser un nom de variable à vous référer au module.Bien sûr, rien ne vous empêche de l'importer à nouveau pour obtenir la référence pour le module dans un nom que vous pouvez utiliser. Depuis qu'il a déjà été importés une fois, il ne sera pas effectivement être importé à nouveau:
Vous pouvez également obtenir la référence directement à partir de
sys.modules
.from foo import *
. Cela peut ou ne pas faire le recharger inutile.La raison que j'utilise reload() est parce que j'ai changer le code source du module et de le tester et la raison que j'utilise à partir de myapp import est parce qu'il me permet de gagner de la frappe.
OriginalL'auteur kindall
Vous ne pouvez pas. C'est une des raisons pour lesquelles l'aide de
from X import *
est une mauvaise idée.OriginalL'auteur NPE
De clarifier Wooble commentaire, à l'aide de "de foo import *" apporte tout de foo dans l'espace de noms courant. Cela peut conduire à des collisions de nom (où vous involontairement affecter une nouvelle valeur à un nom déjà en cours d'utilisation) et peut également rendre plus difficile de dire où quelque chose est venu. Alors que quelques bibliothèques sont souvent utilisés de cette manière, il provoque généralement plus de problèmes qu'elle en vaut la peine.
Aussi, car il a été introduit dans l'espace de noms courant il ne peut pas simplement être rechargé. Il est généralement préférable de le garder dans un namespace (peut-être avec une courte commodité alias comme juste m). Cela vous permet de recharger (ce qui est utile pour les tests, mais rarement une bonne idée en dehors de l'essai) et aide respectée il de l'espace de noms pur.
OriginalL'auteur TimothyAWiseman