<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xml" href="/cjs/screen.xsl" media="screen"?>
<lecture>

<meta>
  <maintitle>Python</maintitle>
  <author>Jiří Znamenáček</author>
  <title>Úvod do práce s moduly</title>
  <date>2020-11-26</date>
  <link><!--a href="http://vyuka.ookami.cz" rel="external">http://vyuka.ookami.cz</a--></link>
  <!--
  <style>
    /* CSSka */
  </style>
  <use-math/>
  -->
</meta>
<!--
  „“–…
  ←→ ↑↓ ↔↕
  ↵ aneb &#x21B5; aneb \r aneb CR aneb CarriageReturn
-->


<slide title="Úvod">

    <p>
        Pythonovské moduly patří mezi jednu z úžasných vlastností tohoto jazyka. Práce s nimi je v základu tak snadná, že je člověk začne používat prakticky automaticky bez jakéhokoliv mentálního bloku (což se nedá říci o mnoha podobných konceptech v jiných jazycích).
    </p>
    <p>
        Mezi jejich hlavní plusy podle mě patří, že levou zadní dokáží nahradit devět desetin běžného použití tříd, takže člověk netahá OOP tam, kde ho vůbec nepotřebuje (<em>ehm, Java, ehm…</em>).
    </p>
    <p>
        PS: Na druhou stranu <a href="/materialy/python/modules/_modules.xml">plná funkcionalita modulů</a> dokáže být značně ubíjející (a ne vždy se chovající podle dokumentace).
    </p>

</slide>
<slide title="Nejjednodušší modul">

    <p>
        <strong>Nejjednodušším modulem je</strong> – světe div se – <strong>jakýkoliv soubor s pythoním programem</strong>.
    </p>
    <note>
        A to ani nemluvím o tom, že třebas úplně prázdný soubor je také validní pythoní program.
    </note>
    <p>
        Opravdu, na mou duši! Jakmile máte nějaký pythoní soubor <code>program.py</code>, můžete ho pomocí <code>import program</code> naimportovat jako modul do jiného pythoního programu a používat tam!
    </p>
    <examples>
        <!--example lang="python" src="_files/basics/program.py" />
        <xample lang="python" src="_files/basics/test.py" /-->
        <example layout="vertical">
            <program lang="python" src="_files/basics/program.py" />
        </example>
        <example layout="vertical">
            <program src="_files/basics/test-1.py" lang="python" />
            <out src="_files/basics/test-1.out" lang="text"/>
        </example>
    </examples>
    <p>
        Ke „jménům“ z modulu je tedy možno přehledně přistupovat tečkovou notací přeze jméno modulu (a tedy vlastně daného pythoního souboru)..
    </p>

</slide>
<slide title="Další možnosti importu">

    <p>
        ..ale též můžeme importovat přímo jednotlivá jména:
    </p>
    <examples>
        <example layout="vertical">
            <program lang="python" src="_files/basics/program.py" />
        </example>
        <example layout="vertical">
            <program src="_files/basics/test-2.py" lang="python" />
            <out src="_files/basics/test-2.out" lang="text"/>
        </example>
    </examples>
    <p>
        Přitom takto jednoduše přístupná jsou především všechna „jména“ na globální úrovni modulu (tedy proměnné, funkce, dokumentační řetězce, třídy…).
    </p>
    <note>
        PS: V případě tříd je pak možno importovat i jejich funkční podčásti.
    </note>

</slide>
<slide title="Základní pravidla">

    <p>
        Aby to celé fungovalo tak jednoduše, je třeba vyhovět několika celkem jednoduchým požadavkům:
    </p>
    <ul>
        <li>
            jméno pythoního souboru pro import musí být tvaru povoleného pro jména objektů (proměnných, funkcí…);
            <note>
                Takže soubor jménem <em>1.py</em> sice můžete vytvořit a používat jako pythoní program, ale jako modul už ne.
                <example lang="python">
                    >>> 'program'.isidentifier()
                    True
                    >>> '1'.isidentifier()
                    False
                </example>
            </note>
        </li>
        <li>
            modul musí být někde, kde ho uvedený pythoní program dokáže najít;
            <note>
                Pro začátek je nejsnažší mít modul(y) a program(y) na stejném místě (tedy ve stejném adresáři).
            </note>
        </li>
        <li>
            pokud importujete stejná „jména“ z více různých modulů, musíte si pohlídat, aby nedošlo k jejich kolizi.
            <note>
                V případě stejných jmen, která nechcete volat přes tečkovou notaci (tedy pomocí jména příslušného modulu), použijte s výhodou import tvaru <code>from MODUL import JMÉNO as JINÉ_JMÉNO</code>.
            </note>
        </li>
    </ul>
    <p>
    </p>

</slide>
<slide title="Závěrečná poznámka">

    <p>
        Už tenhle naprostý základ stačí, aby člověk používal moduly v Python'u pomalu kdykoliv ho napadne. Prostě stačí v adresáři hlavního programu přesunout například pomocné nebo sdílené výpočty do samostatných souborů a máte elegantně vyřešeno jak oddělení kódu či dat, tak můžete výrazně zpřehlednit vlastní program.
    </p>
    <p>
        Navíc <a href="/materialy/python/modules/_modules.xml">plná funkcionalita modulů</a> není omezena jen na tyto jednoduché případy. Moduly totiž nemusí být pouze jednotlivé (na sobě navzájem nezávislé) soubory, ale mohou tvořit celé hierarchie v sobě zanořených adresářů nebo dokonce mohou být roztroušeny na vícero různých místech souborového systému.
    </p>
    <p>
        Ale už tuhle úplně nejjednodušší variantu je radost používat ^_^
    </p>

</slide>


</lecture>
