Jak sprawić, aby te względne importy działały w Pythonie 3?
Mam strukturę katalogów, która wygląda tak:
project/
__init__.py
foo/
__init.py__
first.py
second.py
third.py
plum.py
Wproject/foo/__init__.py
Importuję klasy zfirst.py
, second.py
ithird.py
i włóż je__all__
.
Jest klasa wfirst.py
o nazwieWonderfulThing
w którym chciałbym użyćsecond.py
i chcesz zaimportować, importując*
zfoo
. (To jest poza zakresem tego pytania, dlaczego chciałbym to zrobić, zakładając, że mam dobry powód.)
Wsecond.py
próbowałemfrom .foo import *
, from foo import *
ifrom . import *
w żadnym z tych przypadków nie maWonderfulThing
importowany. Próbowałem teżfrom ..foo import *
, co powoduje błąd „Próba względnego importu poza pakiet najwyższego poziomu”.
Przeczytałem dokumentację i PEP i nie mogę się dowiedzieć, jak to zrobić. Każda pomoc byłaby doceniana.
Wyjaśnienie / edycja: Wygląda na to, że mogłem źle zrozumieć drogę__all__
działa w pakietach. Używałem go tak samo jak w modułach,
from .first import WonderfulThing
__all__ = [ "WonderfulThing" ]
ale patrząc na dokumenty ponownie wydaje się to sugerować__all__
może być używany tylko w pakietach, aby określić nazwy modułów, które mają być domyślnie importowane; Wydaje się, że nie ma sposobu na włączenie czegokolwiek, co nie jest modułem.
Czy to jest poprawne?
Edytować: Import bez symboli wieloznacznych nie powiódł się (cannot import name WonderfulThing
). Próbowaćfrom . import foo
nie powiodło się, aleimport foo
Prace. Niestety,dir(foo)
nic nie pokazuje.