Mít všechny objekty definované v hlavním programu je sice možné, ale nepěkné, nepřispívá to k čitelnosti a znovupoužitelnosti program (Kromě jiného by to ani Rychlonožka neschválil.)
V Pythonu je možné rozdělit funkce do modulů. Modul je soubor s příponou
.py
(tady je přípona povinná), který obsahuje nějaké příkazy.
Z větší části jde o definice funkcí, tříd, proměnných a dalších objektů.
Možná pomůže příklad:
Soubor my_math.py
:
# Modul my_math.py
"Modul my_math, obsahující moje vlastní funkce"
def fact(n):
"fact(n)\nVrací faktoriál čísla n"
retval = 1
for i in range(1,n+1):
retval = retval * i
return retval
Tímto postupem byl vytvořen na disku soubor, který Python může použít jako modul. Modul je skript, který se spustí ve vlastním prostoru jmen, tento modul si ve svém prostoru jmen vytvoří jednu funkci, kterou je potom možné použít z jiných modulů, či hlavního programu.
To, že hodláte používat objekty z jiného modulu je možné dát Pythonu na vědomí několika způsoby.
import my_math
moc = my_math.fact(45)
Zápis import my_math
znamená, že je načten module my_math
a
vytvořen jmenný prostor se jména my_math
. Z tohoto jmenného
prostoru je poté pomocí tečkové notace (obvyklé v C) použit objekt fact
.
Nechce-li se vám vypisovat dlouhé plně kvalifikované názve, je možné
použít přiřazení f = my_math.fact
. Tento zápis přiřadí objektu
my_math.fact
(i funkce je objekt) další jméno f
, které se již
vytvoří v aktuálním prostoru jmen.
Další možnost je naimportovat jména ze jmenného prostoru modulu přímo do aktuálního jmenného prostoru.
from my_math import fact
moc = fact(45)
Tento kousek kódu ze jmenného prostoru modulu my_math
do aktuálního
jmenného prostoru vloží jméno fact
. Narozdíl od předchozího
příkladu se do aktuálního prostoru jmen nevloží jmenný prostor
my_math
.
Je-li potřeba importovat více modulů najednou, je za import
(první
variantu) možné napsat seznam modulů oddělených čárkami.
Stejně tak, je-li zapotřebí z jednoho modulu importovat více objektů, je
možné zapsat jejich výčet oddělený čárkami.
import re, time, os # importuje moduly re, time a os
from sys import argv, path # z modulu sys importuje objekty argv a path
from gtk import * # z modulu gtk importuje všechno (*)
Poslední příkaz (ano, i import je příkaz) importuje z modulu gtk
všechny objekty, které modul má po svém provedení ve jmenném prostoru.
Při jakémkoliv problému s importem je vygenerována výjimka
ImportError
.
ADVANCED:
Aby byl přesný, poslední příkaz (označený
(*)
) neimportuje ze jmenného modulu všechno, ale pouze skoro
všechno. Jména začínající podtržítkem do aktuálního jmenného prostoru
importována nejsou. Python nemá žádnou kontrolu přístupu
(v C++ jsou to klíčová slova private
, public
, protected
)
Předpokládá však, že pokud jméno objektu začíná podtržítkem, má pro to
programátor nějaký hlubší důvod a nechce, aby tento objekt byl
přistupován zvenku. Na druhé straně se předpokládá, že pokud programátor
ví, co dělá a chce modifikovat i takovéto objekty, asi ví co dělá a
proto jsou i takovéto objekty přístupné pomocí konstrukce
from modul import _chranene_jmeno
Moduly jsou při načítání kompilovány do bytekódu, tento bytekód je
ukládán do souboru s koncovkou .pyc
. Při dalším načítání modulu už
není zapotřebí jej kompilovat a provádí se pouze načtený bytekód. Takto
vytvořené soubory jsou samozřejmě přenositelné mezi počítači.
Přesněji: Při prvním požadavku na import modulu se Python podívá do
cache modulů (sys.modules
). Je-li už takový modul načtený, použije
se varianta z cache. Pokud je potřeba načítat z disku, Python zkusí
najít soubor .py
a .pyc
. Je-li zdrojový kód novější, provede
se znovu kompilace a uložení bytekódu (jsou-li k tomu dostatečná práva).
Neexistuje-li zdrojový kód, Python použije bytekód.
ADVANCED:
Je-li interpreter Pythonu spuštěn s parametrem -O
, vytváří místo
souborů .pyc
soubory s koncovkou .pyo
. Použitím parametru
-O
dáváte najevou, že program je odladěný a z výsledného bytekódu
budou vyházeny všechny příkazy assert
, které se používají pro
ladění. Viz
http://www.python.org/doc/ref/assert.html.
Je-li Python spuštěn s parametrem -OO
(Opravdu Optimalizuj),
do zkompilovaného souboru nedává ani docstringy. Python používá soubory
.pyc
nebo .pyo
podle toho, v jakém režimu byl spouštěn.
V Pythonu je k dispozici mnoho modulů ve standardní knihovně. Jejich úplný seznam je možné dohledat na http://www.python.org/doc/lib/. Zkusím si vzpomenout na ty nejvíce používané:
string
- operace s řetězci: převod mezi čísly a
řetězci, dělení a spojování řetězců, převod na malá a
velká písmenaos
- interface k službám operačního systému,
spouštění procesů, operace s cestami v OSpickle
- převádí objekty do řetězců a zpět. Zajišťuje
persistenci objektůtime
- práce s časemre
- práce s regulárními výrazy. (Tento modul
existuje od Pythonu 1.5, nahrazuje moduly regex
a
regsub
ze starších verzí).math
- různé matematické funkce, cmath
- totéž
pro komplexní číslaV Pythonu existuje několik modulů se zvláštním postavením
__main__
odpovídá hlavnímu programu.
Modul __main__
není potřeba importovat :-)
__builtin__
obsahuje funkce, které jsou
vestavěné fo Pythonu, jsou to např.funkce len()
,
str()
, pow()
, abs()
, range()
,
konverzní funkce list()
, tuple()
, int()
,
long()
a další. Ani jména z modulu __builtin__
není potřeba importovat.
sys
obsahuje například seznam argv
obsahující argumenty programu, seznam path
obsahující cesty, ve kterých se budou vyhledávat moduly
a další užitečné proměnné.
__dict__
Co dělat v okamžiku, kdy od dostanete modul a nevíte, co všechno může nabídnout?