Další Předchozí Obsah

12. Modulární stavba programu

12.1 Moduly

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.

12.2 Standardní moduly

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é:

V Pythonu existuje několik modulů se zvláštním postavením

12.3 Atribut __dict__

Co dělat v okamžiku, kdy od dostanete modul a nevíte, co všechno může nabídnout?


Další Předchozí Obsah