{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "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ů.\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Vytváříme a používáme modul\n", "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.)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tento kód uložte do souboru totojemodul.py v aktuálním adresáři. Tím vytvoříme module `totojemodul`." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing totojemodul.py\n" ] } ], "source": [ "%%file totojemodul.py\n", "\n", "# -*- coding: utf-8 -*-\n", "def foo():\n", " print(\"Tahle funkce nic nedělá\")\n", " return None\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nyní můžeme tento modul importovat" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "import totojemodul" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "a použít funkci foo." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tahle funkce nic nedělá\n" ] } ], "source": [ "totojemodul.foo()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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í." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "data": { "text/plain": [ "['/Users/kuba/workspace/python-fjfi/numerical_python_course/lecture_notes.cz',\n", " '/Users/kuba/miniconda3/envs/fjfi/lib/python37.zip',\n", " '/Users/kuba/miniconda3/envs/fjfi/lib/python3.7',\n", " '/Users/kuba/miniconda3/envs/fjfi/lib/python3.7/lib-dynload',\n", " '',\n", " '/Users/kuba/miniconda3/envs/fjfi/lib/python3.7/site-packages',\n", " '/Users/kuba/miniconda3/envs/fjfi/lib/python3.7/site-packages/IPython/extensions',\n", " '/Users/kuba/.ipython']" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sys import path\n", "# sys.path obsahuje cesty, ve kterých se hledají moduly při importování\n", "path" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Moduly nebo jejich části můžeme i přejmenovat pomocí `... import ... as ...`" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "# přejmenuje modul sys na system\n", "import sys as system\n", "# přejmenuje sys.path na syspath\n", "from sys import path as syspath\n", "# zkusíme, jestli system.path je to samé jako syspath\n", "print(system.path is syspath)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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é." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Spuštění modulu jako skriptu\n", "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á." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ahoj člověče!\n" ] } ], "source": [ "def pozdrav(jak, koho):\n", " print(\"{} {}!\".format(jak, koho))\n", " \n", "if __name__ == \"__main__\":\n", " pozdrav(\"Ahoj\", \"člověče\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Organizace do balíků\n", "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`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Další informace viz [dokumentace](http://docs.python.org/3/tutorial/modules.html)." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.4" } }, "nbformat": 4, "nbformat_minor": 4 }