11. Moduly#
Python organizuje vše do modulů, které slouží pro oddělení jmenných prostorů. Moduly mohou být dále organizovány do balíků (packages). Vznikne tak stromová struktura s libovolným počtem úrovní. Python sám obsahuje obsáhlou knihovnu vestavěných modulů.
11.1. Vytváříme a používáme modul#
Modul v podstatě vznikne uložením souboru. Tento modul může být poté přímo spuštěn (pak mluvíme spíše o skriptu) nebo, jak je tomu obvykle, importován. To se děje pomocí klíčového slova import
. Jakmile je modul importován, můžeme používat jeho obsah (funkce, třídy, globální proměnné apod.).
Tento kód uložte do souboru totojemodul.py v aktuálním adresáři. Tím vytvoříme module totojemodul
.
%%file totojemodul.py
# -*- coding: utf-8 -*-
def foo():
print("Tahle funkce nic nedělá")
return None
Overwriting totojemodul.py
Nyní můžeme tento modul importovat
import totojemodul
a použít funkci foo.
totojemodul.foo()
Tahle funkce nic nedělá
Importovat můžeme také jen některé části module pomocí from ... import
. Z vestavěného modulu sys
importujeme path
, což je seznam adresářů, ve kterých se hledají moduly při importování.
from sys import path
# sys.path obsahuje cesty, ve kterých se hledají moduly při importování
path
['/Users/kuba/workspace/fjfi/python-fjfi/numerical_python_course/lecture_notes.cz',
'/Users/kuba/mambaforge/envs/python-fjfi/lib/python39.zip',
'/Users/kuba/mambaforge/envs/python-fjfi/lib/python3.9',
'/Users/kuba/mambaforge/envs/python-fjfi/lib/python3.9/lib-dynload',
'',
'/Users/kuba/.local/lib/python3.9/site-packages',
'/Users/kuba/mambaforge/envs/python-fjfi/lib/python3.9/site-packages']
Moduly nebo jejich části můžeme i přejmenovat pomocí ... import ... as ...
# přejmenuje modul sys na system
import sys as system
# přejmenuje sys.path na syspath
from sys import path as syspath
# zkusíme, jestli system.path je to samé jako syspath
print(system.path is syspath)
True
Můžeme také importovat vše z modulu pomocí from ... import *
. Toto se doporučuje dělat pouze v interaktivní použití a pouze pokud dobře víte, co děláte. Jinak totiž Python může přepsat lokální proměnné.
Spuštění modulu jako skriptu#
Pokud chceme spustil modul jako skript (tj. pomocí python jméno_souboru.py
, případně pomocí %run
v IPythonu), uděláme to pomocí testování __name__
. Tato proměnná obsahuje jméno modulu, v případě skriptu pak obsahuje “__main__”. Takto by pak mohl vypadat modul, který po spuštění něco udělá.
def pozdrav(jak, koho):
print("{} {}!".format(jak, koho))
if __name__ == "__main__":
pozdrav("Ahoj", "člověče")
Ahoj člověče!
Organizace do balíků#
Jednoúrovňová hierarchie modulů by jistě byla brzy málo, proto je možné organizovat moduly do balíků (packages). Balík vytvoříme pomocí adresáře, do něhož umístíme soubor __init__.py
. Stačí, aby byl soubor prázdný. Do tohoto adresáře pak můžeme umístit moduly. Pro import pak použijeme import jméno_balíku.jméno_modulu
.
Další informace viz dokumentace.