10. seminář - Organizace zdrojového kódu

TEACHINGZPP2

Dosud jsme jako základní nástroj pro abstrakci funkce, které nám sloužili k roydělení kódu do jednotlivých čáastí vykonávající nějaký výpočet. Pokud bychom ale měli k dispozici jen funkce, tak by při větších projektech měl soubor se zdrojovým kódem několik desítek tisíc řádků. V takovém případě by orientace v takovém kódu byla velmi náročná.

Proto nám jazyk Python (a další jazyky) umožňuje rozdělit zdrojový kód do samostaných souborů, kde v jednom souboru máme funkce sloužící například pro práci se seznamy. Tímto docílíme ještě lepšího rozdělení zdrojového kódu. Soubor s funkcemi které slouží k řešení konkrétního problému nazýváme knihovna.

Moduly

Jako modul označujeme v jazyce Python soubor s připonou .py. Jedná se o bězný soubor se zdrojovým kódem u kterého ale nepřepokládáme že bude spuštěn ale, že bude vložen do jiného souboru. Jako příklad si vytvoříme soubor rmath.py který bude obsahovat následující funkci:


    PRECISION = 0.00000001
    # výpočet druhé odmocniny pomocí Newtonovy metody
    # https://cs.wikipedia.org/wiki/Metoda_tečen
    def my_sqrt(number):
        estimate = number
        while True:
            new_estimate = 0.5 * (estimate + number / estimate)
            if abs(new_estimate - estimate) < PRECISION:
                return new_estimate
            estimate = new_estimate
            
    # výpočet n-té mocniny
    def my_power(base, exponent):
        return float(base ** exponent)

Vložení modulu

Pro vložení knihovny používáme příkaz import.


    import file

Po vykonání příkazu import se provede program který, je zapsaný v souboru a vytvoří se nová proměnná pomocí které přistupujeme k funkcím a promenným zapsaných v importovaném souboru.

Čtení ze souboru

Pro čtení souboru (v textovém režimu) slouží metody .read() a .readline(). V následujících ukázkách budeme předpokládat, že existuje soubor s názvem soubor.txt, který obsahuje


    # importování souboru rmath.py
    import rmath
    
    # zavolání funkce my_sqrt
    rmath.my_sqrt(2)
    # výpis konstanty PRECISION
    print(rmath.PRECISION)

Jméno pomocí kterého přístupujeme k funkcím a proměnným se nazyvá namespace. Díky tomu víme z jaké knihovny danou funkci (proměnnou) používáme. Příkaz import umožňuje přejmenovat jmenný prostor


    import file as name

Příklad


    import rmath as m
    
    m.my_sqrt(2)

V jazyce Python je možné importovat pouze část importovaného souboru, například pouze jednu funkci nebo proměnnou.


    from file import part

Napřiklad můžeme chtít importovat pouze funkci my_power


    from rmath import my_power
    
    my_power(2, 10)

Importovanou část programu je možné přejmenovat (pomocí as) a je možné importovat více částí současně.


    # import a přejmenování více částí programu
    from rmath import my_sqrt as f1, my_power as f2
    
    f1(2)    # volání funkce my_sqrt()
    f2(2, 2) # volání funkce my_power()

V případě, že chceme importovat celý obsah souboru, lze použít symbol * (hvězdička).


    from rmath import *

Pro úplnost dodejme, že při použití from příkazu dochází k importování pouze specifikovaných částí.


    from rmath import my_sqrt
    
    # funkce funguje správně (má přístup ke konstantě PRECISION)
    my_sqrt(2) # vypíše: 1.414213562373095
    
    # náš program nemá přístup ke konstantě PRECISION
    print(PRECISION) # způsobí chybu: NameError: name ’PRECISION’ is not defined

Pro lepší organizaci zdrojového kódu můžeme soubory umisťovat do adresářů. Při importu, pak vkládáme celou relativní cestu k souboru se zdrojovým kódem. Jako oddělovače adresářů používáme symbol . (tečka).


    import my_library.rmath
    
    # použití
    my_library.rmath.my_sqrt(2)
    
    # NEBO
    
    import my_library.rmath as m
    
    # použití
    m.my_sqrt(2)

Existující knihovny

Jazyk Python obsahuje spoustu předprogramovaných knihoven. Příkladem může být knihovna math.


    # import knihovny math (součást jazyka Python)
    import math
    
    # druhá odmocnina
    print(math.sqrt(2))

Všechny dostupné knihvny lze najít na adrese: https://docs.python.org/3/library/.

Úkoly

Vytvořte modul matrix z 1. zápočtového úkolu a importute tuto knihovnu do souboru main.py. V souboru main.py naprogramujte funkci pro násobení matic. Implementaci svojí knihovny pro praci s maticemi opatřete v prípadě potřeby novými funkcemi, aby jste usnadlili práci uživateům knihovny.