J'ai une structure de répertoire qui ressemble à ceci:Comment faire pour que ces importations relatives fonctionnent dans Python 3?
project/
__init__.py
foo/
__init.py__
first.py
second.py
third.py
plum.py
Dans project/foo/__init__.py
j'importer des classes de first.py
, second.py
et third.py
et les mettre en __all__
.
Il y a une classe nommée first.py
WonderfulThing
que je voudrais utiliser dans second.py
, et que vous voulez importer par l'importation *
de foo
. (Il est hors de la portée de cette question pourquoi je voudrais le faire, supposons que j'ai une bonne raison.)
En second.py
J'ai essayé from .foo import *
, from foo import *
et from . import *
et dans aucun de ces cas est WonderfulThing
importé . J'ai également essayé from ..foo import *
, ce qui soulève une erreur "Tentative d'importation relative au-delà du paquet toplevel". J'ai lu les documents et le PEP, et je n'arrive pas à comprendre comment faire fonctionner ce document. Toute aide serait appréciée.
Clarification/Edit: Il semble que je puisse avoir mal compris la façon dont fonctionne __all__
dans les paquets. Je l'ai utilisé les mêmes que dans les modules,
from .first import WonderfulThing
__all__ = [ "WonderfulThing" ]
mais en regardant les documents encore, il semble suggérer que __all__
ne peuvent être utilisés dans des emballages pour spécifier les noms des modules à importer par défaut; il ne semble pas y avoir moyen d'inclure quelque chose qui ne soit pas un module.
Est-ce correct?
Modifier: Une importation non générique a échoué (cannot import name WonderfulThing
). Essayer from . import foo
a échoué, mais import foo
fonctionne. Malheureusement, dir(foo)
ne montre rien.
fonctionne-t-il sans l'importation générique? (C'est-à-dire, pouvez-vous importer WonderfulThing de manière explicite?) Les importations relatives peuvent être délicates par elles-mêmes.Je suggère que vous vous assuriez que cela fonctionne avant de passer à __all__. –
'__all__' peut contenir les noms de tous les objets. Ils ne doivent pas être (et ne sont généralement pas) seulement des modules. –
"Malheureusement, dir (foo) ne montre rien." Rien!? Pour moi il montre '['WonderfulThing', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'first']' Vous devez faire quelque chose fondamentalement faux, ou vous ne nous montrez pas le code réel, parce que ce que vous décrivez fonctionne bien. –