Python: recharger la composante Y importés "de X à l'importation Y'?
En Python, une fois que j'ai importé un module de X dans un interpréteur de session à l'aide de import X
, et le module de changements à l'extérieur, je peux recharger le module avec reload(X)
. Les changements deviennent disponibles dans mon interprète session.
Je me demande si cela est également possible lors de l'importation d'un composant de Y à partir du module de X à l'aide de from X import Y
.
La déclaration reload Y
ne fonctionne pas, puisque Y n'est pas un module lui-même, mais seulement un composant (dans ce cas une classe) à l'intérieur d'un module.
Est-il possible de recharger différents composants d'un module sans quitter l'interprète de session (ou de l'importation de l'ensemble du module)?
EDIT:
Pour plus de précisions, la question est à propos de l'importation d'un classe ou d'une fonction Y à partir d'un module X et de le recharger sur un changement, et pas un module de Y à partir d'un paquet X.
- Je crois qu'il y a une contradiction dans cette question: "
... possible ... import a component Y from module X
" vs "question is ... importing a class or function X from a module Y
". Je suis en ajoutant une modification à cet effet. - il semble que la réponse n'est pas réellement répondre à la question, je crois que la mienne. Pouvez-vous mettre à jour/commentaire?
Vous devez vous connecter pour publier un commentaire.
Si Y est un module (et X un paquet)
reload(Y)
va être bien -- dans le cas contraire, vous verrez pourquoi bien Python guides de style (comme mon employeur) dire à jamais importer quoi que ce soit sauf un module (c'est l'une des nombreuses bonnes raisons -- pourtant, les gens gardent encore l'importation de fonctions et de classes directement, n'importe comment beaucoup je précise que c'est pas une bonne idée;-).import this
à partir de l'invite interactive pour voir le Zen de Python); et toutes les raisons pourquoi les espaces de noms sont un coup de klaxon bonne idée (local immédiat des indices visuels que le nom de l'être regardé jusqu', la facilité de se moquer de/par voie intraveineuse dans les tests, la capacité de rechargement, la capacité pour un module pour modifier de manière flexible par la redéfinition de certaines entrées, prévisibles et contrôlables comportement sur la sérialisation et la récupération de vos données [[par exemple, par le décapage et la unpickling]], et ainsi de suite, et ainsi de suite -- une SORTE de commentaire, c'est à peine assez longue pour faire justice à cette riche, longue argumentation!!!-)importlib
paquet.importlib.reload(Y)
docs.python.org/3.4/library/... voir aussi stackoverflow.com/questions/961162/...from
"?Réponse
De mes tests. Le marqués de réponse, ce qui suggère un simple
reload(X)
, ne fonctionne pas.De ce que je peux dire, la bonne réponse est:
Test
Mon test était la suivante (Python 2.6.5 + bpython 0.9.5.2)
X. py:
bpython:
Foo
qui a un__init__.py
qui extrait un sous-module... je vais poster une réponse comme un contre-exemple.Tout d'abord, vous ne devriez pas être à l'aide de recharger à tout, si vous pouvez l'éviter. Mais supposons que vous avez vos raisons (c'est à dire de débogage à l'intérieur d'INACTIVITÉ).
Le rechargement de la bibliothèque ne sera pas obtenir les noms de retour dans le module de l'espace de noms. Pour ce faire, il suffit de réaffecter les variables:
Vous pourriez faire un peu de d'autres façons. Vous pouvez automatiser le processus par la recherche à travers l'espace de noms local, et la réaffectation des rien de ce qui a été à partir du module en question, mais je pense que nous sommes assez mal.
Si vous voulez faire ceci:
Faire ceci à la place:
Vous pouvez maintenant utiliser myobject de la même manière que vous avez été la planification (sans la fastidieuse illisible mymodule références partout).
Si vous travaillez de manière interactive et souhaitez recharger myobject de mymodule maintenant, vous pouvez à l'aide de:
en supposant que vous avez utilisé
from X import Y
, vous avez deux options:ou
quelques considérations:
A. si l'importation de la portée n'est pas un module à l'échelle de (e,g: importer dans une fonction) - vous devez utiliser la deuxième version.
B. si Y est importé dans X à partir d'un autre module (Z) - vous devez recharger Z, de les recharger X et de les recharger votre module, même recharger tous vos modules (e,g: à l'aide de
[ reload(mod) for mod in sys.modules.values() if type(mod) == type(sys) ]
) peut recharger X avant de recharger Z - et que de ne pas actualiser la valeur de Y.reload()
moduleX
,reload()
module d'importation deY
deX
.Noter que le rechargement ne changera pas déjà créé des objets liés à d'autres espaces de noms (même si vous suivez guide de style de la part d'Alex).
Si vous travaillez dans un jupyter de l'environnement, et vous avez déjà
from module import function
pouvez utiliser la fonction magique,autoreload
parL'introduction de la
autoreload
dans IPython est donné ici.Juste pour suivre AlexMartelli de l' et Catskul de l' réponses, il y a vraiment simple, mais méchant cas qui semblent confondre
reload
, au moins en Python 2.Supposons que j'ai la suite de l'arborescence source:
avec le contenu suivant:
init.py:
bar.py:
Cela fonctionne très bien sans l'aide de
reload
:Mais essayez de recharger et elle n'a aucun effet ou corrompt les choses:
La seule façon que je pouvais assurer la
bar
sous-module a été rechargé était dereload(foo.bar)
; la seule façon que je accéder à la rechargéeQuux
classe est d'atteindre et saisir à partir de la reloaded sous-module; mais lafoo
module lui-même gardé maintenant sur l'origineQuux
objet de classe, sans doute parce qu'il utilisefrom bar import Bar, Quux
(plutôt queimport bar
suivie parQuux = bar.Quux
); en outre, leQuux
la classe a obtenu hors de synchronisation avec elle-même, ce qui est tout à fait étrange.