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ů.

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.

In [1]:
%%file totojemodul.py

# -*- coding: utf-8 -*-
def foo():
    print(u"Tahle funkce nic nedělá")
    return None
Writing totojemodul.py

Nyní můžeme tento modul importovat

In [2]:
import totojemodul

a použít funkci foo.

In [3]:
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í.

In [4]:
from sys import path
# sys.path obsahuje cesty, ve kterých se hledají moduly při importování
path
Out[4]:
['',
 '/sw/python2/anaconda3/envs/python_course/lib/python34.zip',
 '/sw/python2/anaconda3/envs/python_course/lib/python3.4',
 '/sw/python2/anaconda3/envs/python_course/lib/python3.4/plat-linux',
 '/sw/python2/anaconda3/envs/python_course/lib/python3.4/lib-dynload',
 '/sw/python2/anaconda3/envs/python_course/lib/python3.4/site-packages',
 '/sw/python2/anaconda3/envs/python_course/lib/python3.4/site-packages/Sphinx-1.3.1-py3.4.egg',
 '/sw/python2/anaconda3/envs/python_course/lib/python3.4/site-packages/setuptools-18.0.1-py3.4.egg',
 '/sw/python2/anaconda3/envs/python_course/lib/python3.4/site-packages/IPython/extensions']

Moduly nebo jejich části můžeme i přejmenovat pomocí ... import ... as ...

In [5]:
# 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á.

In [6]:
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.

Komentáře

Comments powered by Disqus