Balíčky
Co jsou to balíčky
Moduly je možné v Pythonu združovat do balíčků (packages). Balíček
je adresář se soubory Pythonu (moduly).
Balíčky a moduly v balíčcích se importují podobně jako moduly (příkazem
import). Aby Python považoval adresář za balíček, musí
být v adresáři soubor __init__.py.
Soubor může být i prázný, aby to všechno fungovalo, ale je i pár
věcí, které se do něj dají zapsat (viz dále).
Struktura balíčků může vypadat třeba takto (převzato z oficiálního tutoriálu Pythonu):
sound/ Top-level package
__init__.py Initialize the sound package
formats/ Subpackage for file format conversions
__init__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
...
filters/ Subpackage for filters
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
Import balíčků
Aby šlo balíčky naimportovat, musí být adresáře v cestě os.path.
import sounds.effects.echo
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
# jiný způsob importu a použití balíčku
from sounds.effects import echo
echo.echofilter(input, output, delay=0.7, atten=4)
# import jedné funkce a její použití
from sounds.effects.echo import echofilter
echofilter(input, output, delay=0.7, atten=4)
Moduly uvnitř balíčků se mohou na jiné moduly uvnitř stejnýcg balíčků odkazovat relativní cestou. Tečka označuje aktuální balíček a dvě tečky nadřazený.
from . import echo
from .. import formats
from ..filters import equalizer
Soubor __init__.py
Soubor __init__.py musí být v každém adresáři,
který má být Pythonem chápán jako balíček (stačí i prázdný soubor).
V tomto souboru může být definována seznam __all__,
která určuje, jaké moduly se načtou importem from package import *.
Pouze moduly vyjmenované v __all__ jsou importovány příkazem
from … import *.
__all__ = ["echo", "surround", "reverse"]
Pokud není v __init__.py __all__ definováno,
je nahrán pouze balíček (a případně vše, co je definováno v __init__.py).
Při prvním importu balíčku se provádí kód v __init__.py. Proto se
do __init__.py často píše inicializační kód balíčku (kam taky jinam).
Pokud vás nenapadá, co byste do __init__.py psali za kód, tak tam
nic nepište :-).