Írtam egy package-t, ami szépen működik, de elég bénán építettem fel a hierarchiáját - import-ok keresztbe kasul és amúgy se mondható rendezettnek. Keresem a módot, hogy miként lehetne olyan package-t írni, ami egy másikba ágyazva is ugyanúgy működik, mintha csak egymagában használnám. Ez alapjába véve nem is lenne gond, de szeretném a közös cuccokat az __init__.py-be tenni és itt jön a probléma, ugyanis ha import pack
-kal használom, akkor a pack.kozos_cucc
néven elérem ezeket a függvényeket/változókat, viszont a from pack import *
nem tölti be őket.
Persze, a válasz egyszerű, miért nem használom az első megoldást és minden elé kiírom a csomag nevét? Azért, mert a tkinter is az __init__.py-ben tárolja a legtöbb objektumát, mégis működik az import tkinter
és a from tkinter import *
egyaránt, tehát valszeg én vagyok képzetlen.
Mi a szabványos módja annak, hogy egy csomagon belül hivatkozzak a saját __init__.py-re, és hogy az abban található deklarációkat a main fájl a fent említett import módok közül bármelyikkel elérje?
EDIT:
Hogy gyakorlati példán is mutassam:
______________________________ KÖNYVTÁRSZERKEZET _____________________________
main.py
pack/
__init__.py
egyik.py
subpack/
__init__.py
masik.py
___________________________________ FÁJLOK ___________________________________
__ MAIN.PY ____________________________
import sys
import pack
import pack.egyik
import pack.subpack
import pack.subpack.masik
print( sys.modules[ __name__ ] )
print( pack.var )
pack.egyik.fgv()
print( pack.subpack.var )
pack.subpack.masik.fgv()
__ PACK/__INIT__.PY ___________________
import sys
__all__ = [ 'egyik' ]
var = sys.modules[ __name__ ]
__ PACK/EGYIK.PY ______________________
import sys
import pack
def fgv():
print( sys.modules[ __name__ ], pack.var )
__ PACK/SUBPACK/__INIT__.PY ___________
import sys
__all__ = [ 'masik' ]
var = sys.modules[ __name__ ]
__ PACK/SUBPACK/MASIK.PY ______________
import sys
import pack.subpack
def fgv():
print( sys.modules[ __name__ ], pack.subpack.var )
__________________________________ KIMENET ___________________________________
<module '__main__' from 'foo\main.py'>
<module 'pack' from 'foo\pack\__init__.py'>
<module 'pack.egyik' from 'foo\pack\egyik.py'> <module 'pack' from 'foo\pack\__init__.py'>
<module 'pack.subpack' from 'foo\pack\subpack\__init__.py'>
<module 'pack.subpack.masik' from 'foo\pack\subpack\masik.py'> <module 'pack.subpack' from 'foo\pack\subpack\__init__.py'
Az import tkinter
és a from tkinter import *
dolgot félreérthettem, mert a fenti példában mindkét módon működik az '__init__.py'-kben lévő deklarációk importálása.
Azt akarom elérni, hogy ha nem a 'main.py', hanem az 'egyik.py' a fő fájl, amiből indítoma progit, akkor is működjön az 'egyik' és a 'subpack' és mindkettő lássa a 'subpack/__init__.py'-ben deklarált változókat, osztályokat, függvényeket. Ehhez viszont az kell, hogy képes legyen dinamikusan importálni a saját '__init__' fájlját és a 'subpack'-ot is, mert ha ez nem így történne, az import pack.subpack
-ot kézzel kéne átírni import subppack
-ra és ez szerintem nem épp professzionális megoldás.