IPython: jedno z nejpropracova­nějších interaktivních prostředí pro práci s Pythonem

23. 2. 2021
Doba čtení: 31 minut

Sdílet

 Autor: Python
Jedním z nejužitečnějších nástrojů pro vývojáře používající jazyk Python je vedle editoru, IDE a debuggeru nástroj nazvaný IPython. Ten vylepšuje interaktivní prostředí Pythonu o mnoho dalších technologií.

Obsah

1. IPython – jedno z nejpropracovanějších interaktivních prostředí pro práci s Pythonem

2. IPython pro různé verze programovacího jazyka Python

3. První seznámení s IPythonem

4. Volba způsobu ovládání IPythonu

5. Standardní klávesové zkratky v režimu emulace Emacsu

6. Standardní klávesové zkratky v režimu emulace Vi/Vimu

7. Vstupní řádek a koncept buněk

8. Historie zadávaných příkazů a jejich výsledků

9. Automatické odsazování zapisovaného kódu

10. Doplňování názvů funkcí, metod a proměnných

11. Introspekce: zobrazení informací o vybraném objektu

12. Spuštění příkazů shellu

13. Kouzelné funkce IPythonu

14. Kouzelné funkce %cpaste a %edit

15. Načtení, uložení a zveřejnění zdrojových kódů

16. Databáze s historií spouštěných příkazů

17. Vybrané „konkurenční“ projekty

18. Projekty bpython, ptpython a dreampie

19. Obsah druhé části článku

20. Odkazy na Internetu

1. IPython – jedno z nejpropracovanějších interaktivních prostředí pro práci s Pythonem

Pravděpodobně všichni vývojáři, kteří používají programovací jazyk Python, se seznámili s interaktivním režimem Pythonu. Tento režim, který se taktéž někdy nazývá interaktivní smyčka REPL (což je zkratka vycházející z plného označení Read-Eval-Print-Loop, které pochází z dávného období, v němž vznikal programovací jazyk LISP) se použije ve chvíli, kdy spustíme interpret Pythonu bez specifikace skriptu, který se má analyzovat a následně spustit (s poloskrytým mezipřekladem do bajtkódu). Samotná interaktivní smyčka REPL se může nacházet v několika stavech, které se rozlišují takzvanou výzvou (prompt). Ve výchozím stavu se očekává specifikace jednoho příkazu, který se ihned vykoná po stisku klávesy Enter, ovšem můžeme si taktéž nechat zobrazit nápovědu, začít zadávat deklaraci funkce či třídy atd. V takovém případě se očekává víceřádkový vstup a výzva se změní.

Obrázek 1: Interaktivní smyčka REPL programovacího jazyka Python verze 2.7.6 (což je dnes již zastaralá varianta).

Ovšem samotná standardní smyčka REPL má některá (možná bychom mohli říci spíše mnohá) omezení. Sice umožňuje doplnění klíčového slova nebo jména funkce/metody klávesou TAB, ovšem již mnohdy nedokáže rozlišit kontext pro doplňování (jméno souboru atd.). Taktéž se špatně vrací v historii příkazů ve chvíli, kdy se jedná například o několikařádkovou deklaraci. A navíc REPL automaticky neprovádí odsazení příkazů uvnitř bloku, což je pro programovací jazyk, v němž hraje odsazení zcela zásadní roli, dosti nepříjemné:

>>> def x():
... pass
  File "<stdin>", line 2
    pass
       ^
IndentationError: expected an indented block

Taktéž je problematické volání příkazů shellu, což je mnohdy velmi užitečná vlastnost. Dále popsaný projekt IPython (a taktéž některé další nástroje zmíněné v sedmnácté kapitole a kapitole osmnácté) tyto problémy řeší a navíc uživatelům nabízí i mnohé další funkce a techniky vhodné pro doslova každodenní používání.

Obrázek 2: Interaktivní smyčka REPL programovacího jazyka Python verze 3.6.3 (což je opět již postarší verze).

Samotný projekt IPython vznikl již v roce 2001, kdy se jednalo o velmi malý pomocný nástroj čítající pouhých 259 řádků kódu vytvořených v Pythonu. Autorem této verze byl Fernando Perez, který se vývoji IPythonu věnoval i dále. Další verze nabídly číslované vstupy (takzvané buňky), paměť pro výstup příkazů, načtení často používaných knihoven atd. IPython se začal používat pro datové analýzy a na jeho základě později vznikl projekt Jupyter Notebook. Dnes se ovšem budeme věnovat klasickému IPythonu.

2. IPython pro různé verze programovacího jazyka Python

Na některých operačních systémech se stále ještě setkáme s tím, že existují balíčky s IPythonem postaveným na Pythonu 2 a současně i další verze postavená na Pythonu 3. V takovém případě je bezpečnější při instalaci určit verzi IPythonu přesně, například následovně (i když konkrétně Fedora 33 už IPython postavený na Pythonu 2 nenabízí):

# dnf install python3-ipython

Instalace probíhá zcela standardním způsobem:

Last metadata expiration check: 2:56:32 ago on Tue 16 Feb 2021 11:14:20 AM CET.
Dependencies resolved.
================================================================================
 Package                  Arch   Version         Repository                Size
================================================================================
Installing:
 python3-ipython          noarch 7.18.1-1.fc33   beaker-Fedora-Everything 800 k
Installing dependencies:
 python3-backcall         noarch 0.1.0-11.fc33   beaker-Fedora-Everything  27 k
 python3-ipython_genutils noarch 0.1.0-23.fc33   beaker-Fedora-Everything  51 k
 python3-jedi             noarch 0.17.1-2.fc33   beaker-Fedora-Everything 1.0 M
 python3-parso            noarch 0.7.0-2.fc33    beaker-Fedora-Everything 147 k
 python3-pexpect          noarch 4.8.0-5.fc33    beaker-Fedora-Everything 134 k
 python3-pickleshare      noarch 0.7.5-4.fc33    beaker-Fedora-Everything  18 k
 python3-prompt-toolkit   noarch 3.0.5-4.fc33    beaker-Fedora-Everything 576 k
 python3-ptyprocess       noarch 0.6.0-11.fc33   beaker-Fedora-Everything  30 k
 python3-pygments         noarch 2.6.1-5.fc33    updates                  1.8 M
 python3-traitlets        noarch 4.3.3-4.fc33    beaker-Fedora-Everything 159 k
 python3-wcwidth          noarch 0.2.5-2.fc33    beaker-Fedora-Everything  42 k
 
Transaction Summary
================================================================================
Install  12 Packages
 
Total download size: 4.8 M
Installed size: 21 M
Is this ok [y/N]: y

Samotné stažení, rozbalení a nastavení balíčků:

Downloading Packages:
(1/12): python3-backcall-0.1.0-11.fc33.noarch.r 453 kB/s |  27 kB     00:00
(2/12): python3-ipython_genutils-0.1.0-23.fc33. 700 kB/s |  51 kB     00:00
(3/12): python3-ipython-7.18.1-1.fc33.noarch.rp 8.9 MB/s | 800 kB     00:00
(4/12): python3-parso-0.7.0-2.fc33.noarch.rpm   4.1 MB/s | 147 kB     00:00
(5/12): python3-pickleshare-0.7.5-4.fc33.noarch 1.6 MB/s |  18 kB     00:00
(6/12): python3-pexpect-4.8.0-5.fc33.noarch.rpm 4.0 MB/s | 134 kB     00:00
(7/12): python3-jedi-0.17.1-2.fc33.noarch.rpm    15 MB/s | 1.0 MB     00:00
(8/12): python3-ptyprocess-0.6.0-11.fc33.noarch 1.5 MB/s |  30 kB     00:00
(9/12): python3-wcwidth-0.2.5-2.fc33.noarch.rpm 2.1 MB/s |  42 kB     00:00
(10/12): python3-traitlets-4.3.3-4.fc33.noarch. 4.8 MB/s | 159 kB     00:00
(11/12): python3-prompt-toolkit-3.0.5-4.fc33.no  12 MB/s | 576 kB     00:00
(12/12): python3-pygments-2.6.1-5.fc33.noarch.r  11 MB/s | 1.8 MB     00:00
--------------------------------------------------------------------------------
Total                                           5.4 MB/s | 4.8 MB     00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
 
...
...
...
 
Installed:
  python3-backcall-0.1.0-11.fc33.noarch
  python3-ipython-7.18.1-1.fc33.noarch
  python3-ipython_genutils-0.1.0-23.fc33.noarch
  python3-jedi-0.17.1-2.fc33.noarch
  python3-parso-0.7.0-2.fc33.noarch
  python3-pexpect-4.8.0-5.fc33.noarch
  python3-pickleshare-0.7.5-4.fc33.noarch
  python3-prompt-toolkit-3.0.5-4.fc33.noarch
  python3-ptyprocess-0.6.0-11.fc33.noarch
  python3-pygments-2.6.1-5.fc33.noarch
  python3-traitlets-4.3.3-4.fc33.noarch
  python3-wcwidth-0.2.5-2.fc33.noarch
 
Complete!

Obrázek 3: Průběh instalace.

Obrázek 4: Dokončení instalace.

Podobně je tomu i v Mintu (a dalších distribucích odvozených z Ubuntu):

$ sudo apt-get install ipython3

Začátek instalace:

Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  python3-backcall python3-decorator python3-ipython python3-ipython-genutils
  python3-jedi python3-parso python3-pickleshare python3-prompt-toolkit
  python3-pygments python3-traitlets python3-wcwidth
Suggested packages:
  python-ipython-doc python-pygments-doc ttf-bitstream-vera
The following NEW packages will be installed:
  ipython3 python3-backcall python3-decorator python3-ipython
  python3-ipython-genutils python3-jedi python3-parso python3-pickleshare
  python3-prompt-toolkit python3-pygments python3-traitlets python3-wcwidth
0 upgraded, 12 newly installed, 0 to remove and 400 not upgraded.
Need to get 1 990 kB of archives.
After this operation, 12,1 MB of additional disk space will be used.
Do you want to continue? [Y/n]

Samotné stažení, rozbalení a nastavení balíčků:

Get:1 http://archive.ubuntu.com/ubuntu focal/universe amd64 python3-backcall all 0.1.0-2 [11,2 kB]
Get:2 http://archive.ubuntu.com/ubuntu focal/main amd64 python3-decorator all 4.4.2-0ubuntu1 [10,3 kB]
 
Setting up python3-traitlets (4.3.3-3) ...
Setting up python3-prompt-toolkit (2.0.10-2) ...
Setting up python3-jedi (0.15.2-1) ...
Setting up python3-ipython (7.13.0-1) ...
Setting up ipython3 (7.13.0-1) ...
Processing triggers for man-db (2.9.1-1) ...

Po instalaci se přesvědčte, že je nainstalována správná varianta:

$ ipython --version
 
7.18.1
Poznámka: opis instalovaných balíčků je v článku uveden naschvál, protože je z něj patrné, že se instaluje jak knihovna Prompt Toolkit zmíněná dále, tak i například knihovna Jedi určená pro statickou analýzu kódu v Pythonu.

3. První seznámení s IPythonem

Prostředí IPythonu se spouští příkazem ipython, popř. ipython3. Po spuštění proběhne inicializace, která může v závislosti na nastavení a počtu použitých pluginů trvat několik sekund. Poté se zobrazí výzva (prompt), která se ovšem liší od klasické výzvy interpretru Pythonu (obsahuje číslo buňky):

$ ipython
 
Python 3.9.1 (default, Jan 20 2021, 00:00:00)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.18.1 -- An enhanced Interactive Python. Type '?' for help.
 
In [1]:

Obrázek 5: Prostředí IPythonu.

Příkazem ? je možné si nechat zobrazit obsah vestavěné nápovědy:

Obrázek 6: Vestavěná nápověda IPythonu.

Z nově dostupných funkcí je zajímavé a užitečné především automatické doplňování jmen funkcí, metod, proměnných. To však není vše, protože klávesou TAB, která automatické doplňování spouští, lze například zapisovat znaky z Unicode. Příklad je uveden na další dvojici screenshotů:

Obrázek 7: Po zápisu tohoto textu a stlačení klávesy TAB

Obrázek 8: … se provede převod na příslušný znak z Unicode.

Dostupné jsou i další funkce, které budou podrobněji popsané v navazujících kapitolách:

  • introspekce
  • zobrazení dokumentace, popř. zdrojového kódu k libovolnému objektu
  • práce s historií příkazů i jejich výsledků
  • zvýraznění syntaxe
  • chytré odsazování
  • kouzelné (magic) funkce
  • makra
  • spouštění příkazů shellu
  • spouštění příkazů určených pro jiné interpretry (Ruby atd.)
  • zavolání externího editoru
  • uložení, popř. zpětné načtení zdrojových kódů
  • uložení, popř. zpětné načtení proměnných

4. Volba způsobu ovládání IPythonu

Interaktivní prostředí IPythonu je možné ovládat dvěma prakticky zcela rozdílnými způsoby – buď se používají klávesové zkratky převzaté z velké části z Emacsu (tedy takové zkratky, které jsou výchozí i v BASHi), nebo se naopak mohou použít klávesové zkratky inspirované konkurenčními textovými editory Vi a Vim. Starší verze IPythonu byly založeny na knihovně GNU Readline (a rozhraní pro Python nazvané readline), o níž se můžete dozvědět více informací například přímo na stránkách této knihovny. Tomu taktéž odpovídá použití konfiguračního souboru .inputrc s nastavením způsobu ovládání, který může v případě, že preferujete klávesové zkratky Vimu, vypadat následovně:

set editing-mode vi
set keymap vi-command
Poznámka: pro ovládání ve stylu Emacsu není nutné použít žádné volby, protože se jedná o výchozí chování.

Ovšem naproti tomu nové verze IPythonu jsou postaveny na knihovně pojmenované Prompt Toolkit, s níž jsme se již na stránkách Rootu seznámili v trojici článků [1] [2] [3] a [4]. Tato knihovna přináší nové možnosti, například zobrazení kontextových menu apod.

Opět platí, že výchozí způsob ovládání je do jisté míry převzat z Emacsu. Pro přepnutí do druhého režimu poslouží následující volba zadávaná při spouštění IPythonu z příkazového řádku:

$ ipython --TerminalInteractiveShell.editing_mode=vi

Ovšem toto nastavení je pouze dočasné. Pokud budete chtít IPython ovládat ve stylu Vimu po každém spuštění, je nutné nejdříve vytvořit takzvaný profil, a to konkrétně příkazem:

$ ipython profile create
 
[ProfileCreate] Generating default config file: '/home/tester/.ipython/profile_default/ipython_config.py'

Následně se v právě vytvořeném souboru „~/.ipython/profile_defau­lt/ipython_config.py“ provede tato úprava:

c.TerminalInteractiveShell.editing_mode = 'vi'
Poznámka: právě proto, že konfigurace je součástí profilu, je možné IPython spouštět s různými profily a měnit tak jeho chování, výchozí interpret atd. Podrobnostmi o profilech se budeme zabývat v navazujícím článku.

Obrázek 9: V režimu Vi/Vim je možné před editační příkazy zadávat počet opakování, který se zobrazí i v textovém uživatelském rozhraní IPythonu. Navíc se zobrazuje i to, zda je aktivní režim vkládání znaků či režim editační/navigační.

5. Standardní klávesové zkratky v režimu emulace Emacsu

V této kapitole jsou vypsány vybrané klávesové zkratky, které jsou ve výchozím nastavení použity IPythonem při nastavení režimu napodobujícího ovládání Emacsu. Zkratky jsou podle své funkce rozděleny do několika kategorií.

Příkazy pro přesuny kurzoru

Základní příkazy pro přesun kurzoru používají kombinaci Ctrl+znak, Alt+znak, popř. alternativně Esc znak v případě, že zkratky Alt+znak kolidují s emulátorem terminálu (například vyvolávají příkazy z menu apod.). V případě, že je terminál správně nakonfigurován, měly by fungovat i kurzorové šipky a navíc i klávesy Home a End (se zřejmou funkcí):

Klávesa Význam
Ctrl+B přesun kurzoru na předchozí znak
Ctrl+F přesun kurzoru na další znak
   
Alt+B přesun kurzoru na předchozí slovo
Alt+F přesun kurzoru na následující slovo
Esc, B shodné s Alt+B
Esc, F shodné s Alt+F
   
Ctrl+A přesun kurzoru na začátek řádku
Ctrl+E přesun kurzoru na konec řádku
Poznámka: i když je v tomto textu napsáno Ctrl+B, znamená to, že se klávesa B použije bez Shiftu.

Mazání textu, práce s kill ringem

Pro přesun části textu v rámci editovaného řádku se používá takzvaný kill ring, do něhož se smazaný text uloží. Pro vložení takto smazaného textu do jiné oblasti (tedy typicky na jiné místo na řádku) se používá operace nazvaná yank (odpovídá dnes běžnější operaci paste). Některé dále uvedené příkazy dokážou s kill ringem pracovat:

Klávesa Význam
Ctrl+K smaže text od pozice kurzoru do konce řádku a uloží ho do kill ringu
Ctrl+U smaže text od začátku řádku do pozice kurzoru a uloží ho do kill ringu
Ctrl+W smaže předchozí slovo a uloží ho do kill ringu
Alt+D smaže následující slovo a uloží ho do kill ringu
   
Ctrl+Y vloží text z kill ringu na místo, na němž se právě nachází kurzor (yank)
Alt+Y po operaci Ctrl+Y dokáže rotovat historií kill ringu a obnovit tak (před)předchozí smazaný text
   
Ctrl+D smaže jeden znak (pokud je ovšem na řádku nějaký obsah, jinak typicky ukončí aplikaci, v IPythonu má i další funkce)

Práce s historií dříve zadaných příkazů

Velmi užitečné jsou příkazy, které dokážou vyvolat již jednou zadané příkazy ze zapamatované historie příkazů:

Klávesa Význam
Ctrl+P průchod historií – předchozí text (lze použít i šipku nahoru)
Ctrl+N průchod historií – následující text (lze použít i šipku dolů)
Ctrl+R zpětné (interaktivní) vyhledávání v historii
Ctrl+G ukončení režimu vyhledávání

Některé další dostupné příkazy

Klávesa Význam
Tab implicitní klávesa pro zavolání completeru (viz další text)
Ctrl+T prohození dvou znaků (před kurzorem a na pozici kurzoru, častý překlep)
   
Alt+U text od pozice kurzoru do konce slova se změní NA VERZÁLKY
Alt+L text od pozice kurzoru do konce slova se změní na mínusky
Alt+C text od pozice kurzoru do konce slova se změní Tak, Že Slova Začínají Velkým Písmenem

6. Standardní klávesové zkratky v režimu emulace Vi/Vimu

Poznámka: ve výchozím nastavení se IPython nachází v režimu vkládání znaků (ve Vi a Vimu se označuje jako insert mode). Pro přepnutí do normálního režimu použijte klávesu Esc.

V režimu emulace editorů Vi/Vim je možné mj. použít i tyto klávesové zkratky:

Příkazy pro přesuny kurzoru

Tyto příkazy jsou platné pro normální režim a lze je zkombinovat s operátory (delete, change, yank atd.):

Klávesa Význam
h přechod kurzoru na předchozí znak
l přechod kurzoru na další znak
b skok (zpět) na první znak slova
e skok na poslední znak slova
w skok na první znak následujícího slova
0 skok na začátek řádku
$ skok na konec řádku
% doskok na párovou závorku
f skok na specifikovaný znak (find)

Editace textu

Klávesa Význam
x smazání jednoho znaku (odpovídá klávese Delete)
d operace smazání textu (musí být následována příkazem pro pohyb kurzoru)
D smazání textu od pozice kurzoru do konce řádku
y přenos textu do registru _ (musí být následována příkazem pro pohyb kurzoru)
c změna textu (musí být následována příkazem pro pohyb kurzoru)
r změna jediného znaku
s změna jediného znaku a přechod do vkládacího režimu
p operace put/paste, vloží smazaný text od pozice kurzoru
P operace put/paste, vloží smazaný text před pozicí kurzoru

Příkazy ve vkládacím režimu

Některé příkazy ve vkládacím režimu odpovídají režimu Emacsu:

Klávesa Význam
Ctrl+T prohození dvou znaků (před kurzorem a na pozici kurzoru)
Ctrl+H smazání znaku nalevo od kurzoru (odpovídá Backspace)
Ctrl+R zpětné (interaktivní) vyhledávání v historii
Ctrl+W smaže předchozí slovo a uloží ho do kill ringu
Ctrl+Y vloží text z registru _ na místo, na němž se nachází kurzor (yank)

Další příkazy

Klávesa Význam
Esc přepnutí do normálního režimu
1–9 prefix pro opakování další operace
u vrácení poslední operace (lze opakovat)
a append – přechod do režimu vkládání
i insert – přechod do režimu vkládání
~ změna jednoho znaku: verzálky/kapitálky a zpět
k průchod historií – předchozí text
j průchod historií – následující text

7. Vstupní řádek a koncept buněk

Pokud porovnáme vzhled prostředí standardního interpretru Pythonu a IPythonu, uvidíme jeden zásadní rozdíl. Ten se týká způsobu zobrazení výzvy (prompt). Zatímco ve standardním interpretru Pythonu je výzva (podle kontextu) zobrazena formou >>> či …, v případě IPythonu se navíc ještě před místem, do kterého se provádí zápis, zobrazuje číslo. Jednotlivé vstupy jsou totiž považovány za buňky (cells), k jejichž obsahu je možné se později vracet. Navíc se rozlišuje mezi vstupem buněk a výslednou hodnotou. Ostatně koncept buněk byl později ještě více rozšířen v Jupyter Notebooku, v němž se buňky (resp. jejich čísla) zobrazují podobným způsobem, i když většinou ve webovém grafickém uživatelském rozhraní:

Obrázek 10: Prostředí standardního interpretru Pythonu.

Obrázek 11: Prostředí IPythonu.

8. Historie zadávaných příkazů a jejich výsledků

Jak jsme si již naznačili v předchozí kapitole, dovoluje nám koncept očíslovaných buněk přistupovat k historii dříve zadaných příkazů a dokonce i jejich výsledků. Poslední tři příkazy jsou dostupné v proměnných pojmenovaných _i, _ii a _iii (typ proměnných je pochopitelně řetězec). Pokud je zapotřebí přistoupit ke konkrétnímu vstupu (příkazu) na základě jeho čísla, je možné použít zápis _ičíslo, například:

In [47]: 6*7
Out[47]: 42
 
In [48]: _i47
Out[48]: '6*7'

Existují ovšem i další způsoby práce s historií příkazů a jejich výsledků. Vstupní (uživatelem zapisované) příkazy jsou uloženy v seznamu _ih, popř. v seznamu In. A nic nám nebrání v přístupu k prvkům těchto seznamů:

In [50]: _ih[47]
Out[50]: '6*7'
 
In [51]: In[47]
Out[51]: '6*7'

Podobným způsobem je umožněno přistupovat k výsledkům příkazů. Ty jsou ukládány v seznamech _oh a Out, přičemž každý výsledek má korektní typ (obecně se tedy nejedná o pouhé řetězce):

In [55]: _oh[47]
Out[55]: 42
 
In [56]: Out[47]
Out[56]: 42

Výsledky je tedy možné použít při výpočtech atd.:

In [17]: 1+2
Out[17]: 3
 
In [18]: 6*7
Out[18]: 42
 
In [19]: Out[17] + Out[18]
Out[19]: 45
 
In [20]: Out[18] / Out[17]
Out[20]: 14.0

V některých případech mohou uživatelé požadovat, aby se výsledek nějakého příkazu nezobrazil, tj. aby se příkaz pouze provedl. I to je možné – za příkaz je ovšem v tomto případě nutné vložit znak středníku:

In [59]: 1+2;
 
In [60]: 1+2
Out[60]: 3

Obrázek 12: Některé možnosti práce s historií výsledků příkazů.

9. Automatické odsazování zapisovaného kódu

IPython správně rozezná začátky vnořeného bloku, což ostatně (alespoň většinou) není nic složitého, protože se pro označení začátku bloku používá znak dvojtečky. Jakmile je zahájen zápis celého bloku, například definice funkce nebo třídy, bude celý tento vstup součástí jediné buňky. Ovšem nejenom to – po stisku klávesy Enter se správně provede odsazení, které tak není nutné zapisovat ručně, na rozdíl od standardní interaktivní smyčky programovacího jazyka Python. Dvojí stisk klávesy Enter (tedy vlastně pokus o vložení prázdného řádku) ukončí vstup a tím i celou buňku. Jediným místem, na němž je nutné s odsazením kódu pracovat ručně, je ukončení vnitřního bloku – tehdy je nutné automaticky vložené odsazení odmazat:

Obrázek 13: Automatické odsazování kódu přímo zapisovaného do buňky IPythonu.

Poznámka: pro zápis delšího textu (zdrojového kódu) je však mnohem lepší použít kouzelnou funkci %edit zmíněnou v dalších kapitolách.

10. Doplňování názvů funkcí, metod a proměnných

Prostředí IPythonu se snaží o kontextové doplnění názvů funkcí, metod, proměnných, kouzelných funkcí atd. K vyvolání menu s nabídkou názvů, které mají v daném kontextu význam, slouží klávesa Tab, a to nezávisle na zvoleném způsobu ovládání IPythonu. Na následující pětici screenshotů jsou některé možnosti kontextového doplňování ukázány:

Obrázek 14: Nabídka názvů globálně dostupných objektů, které začínají na „de“.

Obrázek 15: Zde je nabídka omezena pouze na nainstalované balíčky začínající na „o“.

Obrázek 16: Objekty, které jsou přímo dostupné z balíčku os.

Obrázek 17: Omezení pouze na ty objekty, které začínají na „c“.

Obrázek 18: Kontextové doplnění pracuje i pro uživatelem vytvořené objekty.

11. Introspekce: zobrazení informací o vybraném objektu

Další důležitou vlastností IPythonu je podpora introspekce. O každém (pojmenovaném) objektu je totiž možné zjistit jak základní informace, tak si popř. nechat zobrazit i jeho zdrojový kód (pokud se ovšem nejedná o vestavěnou funkci atd.). Pro získání informací o nějakém objektu se před nebo za název tohoto objektu zapisuje otazník:

var?
?var

Pro výpis zdrojového kódu nebo podrobnějších informací se používá dvojice otazníků:

var??
??var

Příklady použití:

In [9]: os.chdir?
Signature: os.chdir(path)
Docstring:
Change the current working directory to the specified path.
 
path may always be specified as a string.
On some platforms, path may also be specified as an open file descriptor.
  If this functionality is unavailable, using it raises an exception.
Type:      builtin_function_or_method

Popř.:

In [26]: import math
 
In [27]: math.floor?
Signature: math.floor(x, /)
Docstring:
Return the floor of x as an Integral.
 
This is the largest integer <= x.
Type:      builtin_function_or_method
 
In [33]: math?
Type:        module
String form: <module 'math' from '/usr/lib64/python3.9/lib-dynload/math.cpython-39-x86_64-linux-gnu.so'>
File:        /usr/lib64/python3.9/lib-dynload/math.cpython-39-x86_64-linux-gnu.so
Docstring:
This module provides access to the mathematical functions
defined by the C standard.

Získat lze i seznam objektů, které ve svém názvu obsahují určitý podřetězec. Pokud tedy například hledáte funkce pro práci s adresáři, lze použít tečkovou konvenci:

In [6]: import os
 
In [7]: os.*dir*?
os.__dir__
os.chdir
os.curdir
os.fchdir
os.listdir
os.makedirs
os.mkdir
os.pardir
os.removedirs
os.rmdir
os.scandir
os.supports_dir_fd

Prozkoumat je možné i výše zmíněné seznamy se zadanými příkazy i jejich výsledky:

In [49]: _i47?
Type:        str
String form: 6*7
Length:      3
Docstring:
str(object='') -> str
str(bytes_or_buffer[, encoding[, errors]]) -> str

Create a new string object from the given object. If encoding or
errors is specified, then the object must expose a data buffer
that will be decoded using the given encoding and error handler.
Otherwise, returns the result of object.__str__() (if defined)
or repr(object).
encoding defaults to sys.getdefaultencoding().
errors defaults to 'strict'.

Obrázek 19: Ukázka introspekce v IPythonu.

Obrázek 20: Ukázka introspekce v IPythonu.

12. Spuštění příkazů shellu

Tato kapitola bude jen velmi stručná, protože si v ní popíšeme funkci jediného znaku !. Ten slouží pro zavolání libovolného příkazu shellu, ať již vestavěného nebo externího:

!ls

Další příklad použití je uveden na screenshotu:

Obrázek 21: Spuštění příkazu shellu přímo z prostředí IPythonu.

13. Kouzelné funkce IPythonu

V IPythonu se mnoho operací vykonává s využitím takzvaných kouzelných (neboli magických) funkcí, které ovšem nemají nic společného s magickými metodami tříd. Magické funkce začínají znakem % nebo %% a při jejich volání se nepoužívají závorky. Popis všech kouzelných funkcí lze pochopitelně nalézt ve vestavěné nápovědě:

Obrázek 22: Nápověda ke kouzelným funkcím IPythonu.

Nápověda obsahuje seznam těchto funkcí se stručným popisem:

The following magic functions are currently available:
 
%alias:
    Define an alias for a system command.
%alias_magic:
    ::
%autoawait:
  
%autocall:
    Make functions callable without having to type parentheses.
%autoindent:
    Toggle autoindent on/off (deprecated)
%automagic:
    Make magic functions callable without having to type the initial %.
%bookmark:
    Manage IPython's bookmark system.
%cat:
    Alias for `!cat`
%cd:
    Change the current working directory.
%clear:
    Alias for `!clear`
%colors:
    Switch color scheme for prompts, info system and exception handlers.

Kromě toho je ovšem možné si zobrazit nápovědu ke konkrétní vybrané funkci, opět s využitím otazníku:

In [73]: %colors?
Docstring:
Switch color scheme for prompts, info system and exception handlers.
 
Currently implemented schemes: NoColor, Linux, LightBG.
 
Color scheme names are not case-sensitive.
 
Examples
--------
To get a plain black and white terminal::
 
  %colors nocolor
File:      /usr/lib/python3.9/site-packages/IPython/core/magics/basic.py

14. Kouzelné funkce %cpaste a %edit

Editace delších částí zdrojových kódů přímo v IPythonu, tedy na úrovni jednotlivých buněk, není ideální, protože nám mohou chybět pokročilejší funkce programátorských textových editorů. Ovšem díky existenci kouzelných funkcí %cpaste a %edit lze do IPythonu buď přenést celý blok přes schránku (bez snahy o jeho přeformátování), popř. spustit externí editor a upravit v něm zvolenou část kódu. Výběr textového editoru se provádí přes proměnné prostředí $EDITOR, popř. $VISUAL. Nejprve se podívejme na funkci %cpaste. Tu použijeme v případě, že již máme ve schránce naformátovaný zdrojový text:

Obrázek 23: Použití kouzelné funkce %cpaste.

Vkládání se ukončuje klávesovou zkratkou Ctr+D.

Kouzelná funkce %edit (lze ji vyvolat i přes F2) nám umožní spustit editor s možností úpravy vybraného objektu či vytvoření objektu nového:

%edit
%edit filename
%edit funkce
%edit proměnná

Některé další možnosti poskytované touto kouzelnou funkcí jsou vypsány v nápovědě:

Obrázek 24: Nápověda ke kouzelné funkci %edit.

15. Načtení, uložení a zveřejnění zdrojových kódů

Pro načtení souboru se zdrojovými kódy se používá kouzelná funkce nazvaná %load:

Obrázek 25: Nápověda ke kouzelné funkci %load.

Pro opačnou operaci, tedy pro uložení obsahu vybraných buněk slouží kouzelná funkce se jménem %save. Té se předává jak jméno souboru, tak i buňky, které se do něho mají uložit:

In [7]: %save test 1-5
 
The following commands were written to file `test.py`:
get_ipython().run_line_magic('store', '')
get_ipython().run_line_magic('pinfo', '%store')
get_ipython().run_line_magic('pinfo', '%save')
get_ipython().run_line_magic('pinfo', '%load')
get_ipython().run_line_magic('save', '')

Obsah tohoto souboru vypadá následovně:

$ cat test.py
 
# coding: utf-8
get_ipython().run_line_magic('store', '')
get_ipython().run_line_magic('pinfo', '%store')
get_ipython().run_line_magic('pinfo', '%save')
get_ipython().run_line_magic('pinfo', '%load')
get_ipython().run_line_magic('save', '')
Poznámka: při znovunačtení tohoto souboru se jednotlivé buňky „přehrají“:
$ ipython
Python 3.9.1 (default, Jan 20 2021, 00:00:00)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.18.1 -- An enhanced Interactive Python. Type '?' for help.
 
In [1]: load test.py
 
In [2]: # %load test.py
   ...: get_ipython().run_line_magic('store', '')
   ...: get_ipython().run_line_magic('pinfo', '%store')
   ...: get_ipython().run_line_magic('pinfo', '%save')
   ...: get_ipython().run_line_magic('pinfo', '%load')
   ...: get_ipython().run_line_magic('save', '')
   ...:

Historie příkazů (tedy buněk), které lze uložit, lze přečíst kouzelnou funkcí %history:

Obrázek 26: Historie příkazů.

Mezi další užitečné kouzelné funkce patří %pastebin, která zveřejní kód na http://dpaste.com/:

In [4]: %pastebin 1-4
Out[4]: 'http://dpaste.com/GB9YHSEF9'
Poznámka: dalších několik desítek kouzelných funkcí si popíšeme v navazujícím článku.

16. Databáze s historií spouštěných příkazů

Příkazy zadávané do interaktivního prostředí IPythonu jsou na pozadí ukládány do databáze s využitím známého databázového engine SQLite. Obsah této databáze si můžeme snadno prohlédnout, protože pro každý vytvořený profil (a výchozí profil by měl existovat vždy) je vytvořen nový soubor:

$ sqlite3 ~/.ipython/profile_default/history.sqlite
 
SQLite version 3.34.1 2021-01-20 14:10:07
Enter ".help" for usage hints.

Existovat by měly minimálně tři tabulky:

sqlite& .tables
history         output_history  sessions

Tabulka sessions obsahuje informace o jednotlivých sezeních:

sqlite& .schema sessions
CREATE TABLE sessions (session integer
                        primary key autoincrement, start timestamp,
                        end timestamp, num_cmds integer, remark text);

Tabulka s historií obsahuje jednotlivé příkazy vázané na sezení:

sqlite& .schema history
CREATE TABLE history
                (session integer, line integer, source text, source_raw text,
                PRIMARY KEY (session, line));

A konečně třetí tabulka obsahuje výstupní hodnoty jednotlivých příkazů, opět navázané na sezení:

sqlite& .schema output_history
CREATE TABLE output_history
                        (session integer, line integer, output text,
                        PRIMARY KEY (session, line));

Jednotlivá sezení si můžeme snadno vypsat:

sqlite& select * from sessions;
1|2021-02-16 14:13:12.966734|2021-02-16 14:13:18.542516|0|
2|2021-02-16 14:13:21.963139|2021-02-16 14:22:48.566057|2|
3|2021-02-16 15:15:56.297348|2021-02-16 15:21:29.017774|1|
4|2021-02-16 15:21:30.652580|2021-02-16 15:22:44.910039|0|
5|2021-02-16 15:22:48.445362|2021-02-16 15:28:18.674137|0|
6|2021-02-16 17:46:30.920573|2021-02-16 18:32:23.949748|77|
7|2021-02-16 18:32:25.506659|2021-02-17 09:54:32.862249|1|

Stejně tak si můžeme vypsat historii zadávaných příkazů:

sqlite& select * from history limit 10;
2|1|get_ipython().show_usage()|?
2|2|get_ipython().run_line_magic('edit', 'test')|edit test
3|1|get_ipython().show_usage()|?
6|1|os.*dir*|os.*dir*
6|2|get_ipython().run_line_magic('psearch', 'os.*dir*')|os.*dir*?
6|3|import os|import os
6|4|os.*dir*|os.*dir*
6|5|get_ipython().run_line_magic('psearch', 'os.*dir*')|os.*dir*?
6|6|import os|import os
6|7|get_ipython().run_line_magic('psearch', 'os.*dir*')|os.*dir*?

17. Vybrané „konkurenční“ projekty

Poznámka: dále zmíněný projekt ptpython lze zkombinovat s ipythonem.

18. Projekty bpython, ptpython a dreampie

První z těchto projektů se jmenuje bpython a nabízí uživatelům mj. i tyto možnosti, které v původním interpretru nenajdeme. Mezi tyto možnosti patří zejména:

  1. Zvýraznění syntaxe přímo při zápisu jednotlivých řádků, které se mají interaktivně spustit. Pro tento účel se používá knihovna Pygments.
  2. Plná podpora pro editaci prováděnou v rámci příkazového řádku založená na běžných a často používaných zkratkách převzatých z Emacsu.
  3. Automatické odsazení řádků, které se nachází uvnitř smyček, podmínek, deklarací funkcí, deklarací tříd atd.
  4. Možnost zápisu příkazů a deklarací v textovém editoru.
  5. Zobrazení seznamu klíčových slov a funkcí začínajících již zapsaným prefixem (v tomto případě bez nutnosti použití klávesové zkratky).
  6. Automatické doplnění klíčového slova či funkce s využitím klávesyTab ze zobrazené nabídky.
  7. Zobrazení nápovědy s parametry volané funkce nebo metody ihned po zápisu otevírací závorky.
  8. Samozřejmě je podporován i Python 3.x (což už by dnes měl být standard).
  9. Dále tento projekt nabízí možnost získat historii zapsaných příkazů a znovu je zavolat, popř. je nějakým způsobem modifikovat.
  10. Užitečná je i další vlastnost – automatické poslání části zapsaného kódu do služby typu „pastebin“, takže lze velmi snadno kód nasdílet s kolegy (což samozřejmě nijak nenahrazuje plnohodnotný systém pro správu verzí :-).
  11. A samozřejmě je možné zapsaný a otestovaný kód uložit do souboru pro jeho další znovupoužití.

Obrázek 27: Takto vypadá základní uživatelské rozhraní projektu bpython.

Obrázek 28: Velmi užitečná vlastnost – po stisku klávesy F7 se spustí vybraný textový editor, do něhož je možné zapsat libovolnou deklaraci či příkaz(y), které se po ukončení editoru automaticky provedou.

Obrázek 29: Návrat z textového editoru zpět do prostředí REPLu. Vytvořený text se automaticky vložil do interpretru.

Druhý projekt, s nímž se v dnešním článku ve stručnosti seznámíme, se jmenuje ptpython. Kromě toho, že jméno projektu začíná iniciálami autora článku :-) se jedná o zajímavé a užitečné rozšíření možností původního interpretru Pythonu o tyto vlastnosti:

  1. Ve spodní části terminálu je zobrazena stavová řádka, která kontextově mění svůj obsah.
  2. Podporováno je zvýrazňování syntaxe zapisovaných příkazů a deklarací. I v tomto případě se pro tyto účely využívá knihovna Pygments.
  3. Dále tento projekt používá knihovnu Jedi, která (mimo jiné) umožňuje zobrazení kontextových menu s nabídkou metod pro zapsané jméno objektu.
  4. Stejná knihovna (Jedi) je použita pro doplnění klíčových slov, jmen funkcí, názvů metod apod.
  5. Ve výchozím nastavení je umožněna plnohodnotná editace příkazového řádku s využitím klávesových zkratek odvozených od textového editoru Emacs (a používaných v mnoha dalších shellech, například v BASHi, pokud ho nepřepneme do jiného režimu).
  6. V Emacs režimu se na stavové řádce zobrazují některé dostupné příkazy (například při stisku Ctrl+Space pro práci s výběrem).
  7. Klávesovou zkratkou F4 se můžeme prakticky kdykoli přepnout do režimu emulujícího chování modálních editorů Vi a Vim. Podporovány jsou prakticky všechny základní editační příkazy.
  8. Podporován je i záznam maker s jejich pozdějším přehráváním. V režimu Vi/Vim se záznam spustí zkratkou q_písmeno_, přehrání makra pak zkratkou @_písmeno.
  9. Existuje i speciální režim pro vkládání textu přes schránku a podpora pro práci s myší (ovšem podle toho, zda terminál práci s myší umožňuje).
  10. Stiskem klávesy F2 se zobrazí přehledný konfigurační dialog.
  11. Při vyhledávání v historii příkazů přes Ctrl+R se zobrazí všechny nalezené shody.
  12. Barvová schémata jsou konfigurovatelná.

Obrázek 30: Prostředí projektu ihned po spuštění. Povšimněte si stavového řádku, na němž se mj. zobrazuje i zvolený režim, v tomto případě režim EMACSu.

Obrázek 31: Klávesovou zkratkou F4 se můžeme přepnout do režimu emulujícího chování editoru Vi/Vim. Z vkládacího režimu se klávesou Esc přepneme do režimu normálního se všemi základními editačními příkazy i příkazy pro pohyb kurzoru. Klávesou v se otevře vybraný externí editor, do něhož bude možné zapsat složitější deklarace.

Obrázek 32: Po stisku klávesy F2 se zobrazí menu/dialog pro nastavení všech vlastností projektu ptpython. Pohyb a změna hodnot se provádí kurzorovými klávesami, potvrzení pak klávesou Enter.

Třetí potenciálně zajímavý projekt se jmenuje DreamPie. Tento projekt se od výše popsaných projektů bpython a ptpython odlišuje především tím, že používá vlastní implementaci terminálu a podporuje některé prvky využívající grafické uživatelské rozhraní. Toto řešení pochopitelně má svoje výhody, ale i nevýhody. Mezi nevýhody patří větší závislost na systémových knihovnách (GTK, GObject, nová verze by ovšem měla používat Tkinter), mezi výhody pak například možnost dobré spolupráce s Matplotlibem a dalšími podobně koncipovanými knihovnami. Dalším potenciálním problémem je fakt, že je DreamPie naprogramovaný v Pythonu 2, takže budete potřebovat i tento interpret a jeho knihovny (to může být do budoucna problematické).

Samotné uživatelské prostředí projektu DreamPie používá okno terminálu, které je rozděleno na dvě části. V horní části se nachází historie zapsaných a spuštěných příkazů, v části dolní pak vstupní oblast, do které uživatel může zapisovat nové příkazy a provádět další operace. Zapsané příkazy je možné označit a později uložit do souboru pro další použití. Zajímavá a užitečná je i možnost složení (fold) deklarace funkcí, metod či celých tříd, což vede k úspoře plochy obrazovky (samotné složení je možné provést ručně nebo automaticky).

Podobně jako u projektu ptpython je i zde podporováno automatické doplňování kódu, automatické doplňování jmen souborů, automatické dopsání párových závorek, uvozovek atd. Dokonce je možné namísto zápisu:

len("xyzzy")

zapsat pouze:

len xyzzy

a nechat interaktivní prostředí, aby automaticky doplnilo jak závorky, tak i uvozovky.

Poznámka: podobnou techniku lze ovšem v případě potřeby povolit i v IPythonu.

Obrázek 33: Projekt DreamPie dokáže používat svá vlastní GUI okna, což je současně výhoda, ale i nevýhoda tohoto projektu.

Obrázek 34: Jeden z důvodů, proč je DreamPie založen na Pythonu 2.

Obrázek 35: Dialog s nastavením chování interaktivního prostředí.

bitcoin_skoleni

Obrázek 36: Rozdělení okna terminálu na část s historií příkazů (i s výsledky) a na část, do níž se příkazy zapisují.

19. Obsah druhé části článku

V navazujícím článku se zaměříme na popis dalších užitečných magických funkcí. Popíšeme si i možnost přidání vlastních kouzelných funkcí, využití takzvaných kernelů a kombinaci IPythonu s programátorskými textovými editory, popř. s integrovanými vývojovými prostředími.

20. Odkazy na Internetu

  1. Domovská stránka projektu IPython
    https://ipython.org/
  2. IPython (Wikipedia)
    https://en.wikipedia.org/wiki/IPython
  3. Projekt IPython na PyPi
    https://pypi.org/project/ipython/
  4. Dokumentace k IPythonu
    http://ipython.org/documen­tation.html#
  5. IPython Documentation (na ReadTheDocs)
    https://ipython.readthedoc­s.io/en/stable/
  6. IPython Tutorial
    http://ipython.readthedoc­s.org/en/stable/interacti­ve/tutorial.html
  7. IPython Tips & Tricks
    https://ipython.readthedoc­s.io/en/stable/interactive/tip­s.html
  8. IPython cookbook
    https://github.com/ipython/i­python/wiki?path=Cookbook
  9. Cookbook: Index
    https://github.com/ipython/i­python/wiki/Cookbook%3A-Index
  10. Projects using IPython
    https://github.com/ipython/i­python/wiki/Projects-using-IPython
  11. Sebastian Witowski – Wait, IPython can do that?!
    https://www.youtube.com/wat­ch?v=3i6db5zX3Rw
  12. vim-ipython
    https://github.com/ivanov/vim-ipython
  13. IPython Frequently asked questions
    https://github.com/ipython/i­python/wiki/Frequently-asked-questions
  14. What is REPL?
    https://pythonprogramminglan­guage.com/repl/
  15. What is a REPL?
    https://codewith.mu/en/tu­torials/1.0/repl
  16. Programming at the REPL: Introduction
    https://clojure.org/guides/re­pl/introduction
  17. What is REPL? (Quora)
    https://www.quora.com/What-is-REPL
  18. Gorilla REPL: interaktivní prostředí pro programovací jazyk Clojure
    https://www.root.cz/clanky/gorilla-repl-interaktivni-prostredi-pro-programovaci-jazyk-clojure/
  19. Read-eval-print loop (Wikipedia)
    https://en.wikipedia.org/wi­ki/Read%E2%80%93eval%E2%80%93prin­t_loop
  20. Domovská stránka programovacího jazyka Python
    https://www.python.org/
  21. Domovská stránka projektu bpython
    https://bpython-interpreter.org/
  22. Projekt bpython na PyPi
    https://pypi.org/project/bpython/
  23. Git repositář projektu bpython
    https://github.com/bpython/bpython
  24. Projekt ptpython na PyPi
    https://pypi.org/project/ptpython/
  25. Git repositář projektu ptpython
    https://github.com/prompt-toolkit/ptpython
  26. Domovská stránka projektu DreamPie
    http://www.dreampie.org/
  27. Projekt DreamPie na PyPi
    https://pypi.org/project/dreampie/
  28. Git repositář projektu DreamPie
    https://github.com/noamraph/dreampie
  29. Integrovaná vývojová prostředí ve Fedoře: IPython a IPython Notebook
    http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-ipython-a-ipython-notebook/
  30. Integrovaná vývojová prostředí ve Fedoře: praktické použití IPython Notebooku a knihovny Numpy
    http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-prakticke-pouziti-ipython-notebooku-a-knihovny-numpy/
  31. Integrovaná vývojová prostředí ve Fedoře: praktické použití IPython Notebooku a knihovny Numpy (2.část)
    http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-prakticke-pouziti-ipython-notebooku-a-knihovny-numpy-2-cast/
  32. Integrovaná vývojová prostředí ve Fedoře: vykreslování grafů s využitím knihoven Numpy a matplotlib
    http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-vykreslovani-grafu-s-vyuzitim-knihoven-numpy-a-matplotlib/
  33. Integrovaná vývojová prostředí ve Fedoře: vykreslování grafů s využitím knihoven Numpy a matplotlib (2.část)
    http://mojefedora.cz/integrovana-vyvojova-prostredi-ve-fedore-vykreslovani-grafu-s-vyuzitim-knihoven-numpy-a-matplotlib-2-cast/
  34. Is IPython Notebook ever used as an IDE, or merely for presentations?
    https://www.reddit.com/r/I­Python/comments/1uk7hp/is_i­python_notebook_ever_used_as_an_i­de_or_merely/
  35. The IDE as a Bad Programming Language Enabler
    https://dzone.com/articles/ide-bad-programming-language
  36. Enhanced Interactive Python with IPython
    http://www.onlamp.com/pub/a/pyt­hon/2005/01/27/ipython.html
  37. Příkazový řádek – přítel nejvěrnější
    https://www.root.cz/clanky/prikazovy-radek-pritel-nejvernejsi/
  38. Příkazový řádek – přítel nejvěrnější (2)
    https://www.root.cz/clanky/prikazovy-radek-pritel-nejvernejsi-2/
  39. Picking a Python Interpreter (3 vs 2)
    https://docs.python-guide.org/starting/which-python/
  40. Využití knihovny Pygments (nejenom) pro obarvení zdrojových kódů
    https://www.root.cz/clanky/vyuziti-knihovny-pygments-nejenom-pro-obarveni-zdrojovych-kodu/
  41. Využití knihovny Pygments (nejenom) pro obarvení zdrojových kódů: vlastní filtry a lexery
    https://www.root.cz/clanky/vyuziti-knihovny-pygments-nejenom-pro-obarveni-zdrojovych-kodu-vlastni-filtry-a-lexery/
  42. Knihovna Jedi: doplňování kódu a statická analýza kódu v Pythonu
    https://www.root.cz/clanky/knihovna-jedi-doplnovani-kodu-a-staticka-analyza-kodu-v-pythonu/
  43. Knihovna Jedi: doplňování kódu a statická analýza kódu v Pythonu (dokončení)
    https://www.root.cz/clanky/knihovna-jedi-doplnovani-kodu-a-staticka-analyza-kodu-v-pythonu-dokonceni/
  44. Pygments – Python syntax highlighter
    http://pygments.org/
  45. Pygments (dokumentace)
    http://pygments.org/docs/
  46. Write your own lexer
    http://pygments.org/docs/le­xerdevelopment/
  47. Jazyky podporované knihovnou Pygments
    http://pygments.org/languages/
  48. Pygments FAQ
    http://pygments.org/faq/
  49. Pygments 2.2.0 (na PyPi)
    https://pypi.org/project/Pygments/
  50. Syntax highlighting
    https://en.wikipedia.org/wi­ki/Syntax_highlighting
  51. Jedi – an awesome autocompletion/static analysis library for Python
    https://jedi.readthedocs.i­o/en/latest/index.html
  52. Jedi API Overview
    https://jedi.readthedocs.i­o/en/latest/docs/api.html
  53. jedi-vim
    https://github.com/davidhalter/jedi-vim
  54. Tvorba textového rozhraní s knihovnou prompt_toolkit: základní prvky TUI
    https://www.root.cz/clanky/tvorba-textoveho-rozhrani-s-knihovnou-prompt-toolkit-zakladni-prvky-tui/
  55. Tvorba TUI s knihovnou prompt_toolkit: aplikace s celoobrazovkovým rozhraním
    https://www.root.cz/clanky/tvorba-tui-s-knihovnou-prompt-toolkit-aplikace-s-celoobrazovkovym-rozhranim/
  56. Tvorba textového uživatelského rozhraní s knihovnou prompt_toolkit: ovládací prvky (widgety)
    https://www.root.cz/clanky/tvorba-textoveho-uzivatelskeho-rozhrani-s-knihovnou-prompt-toolkit-ovladaci-prvky-widgety/
  57. ØMQ: knihovna pro asynchronní předávání zpráv
    https://www.root.cz/clanky/0mq-knihovna-pro-asynchronni-predavani-zprav/
  58. Další možnosti poskytované knihovnou ØMQ
    https://www.root.cz/clanky/dalsi-moznosti-poskytovane-knihovnou-mq/
  59. What is the difference between Jupyter and IPython Notebook?
    https://www.quora.com/What-is-the-difference-between-Jupyter-and-IPython-Notebook
  60. Jupyter kernels
    https://github.com/jupyter/ju­pyter/wiki/Jupyter-kernels
  61. Keyboard Shortcuts in the IPython Shell
    https://jakevdp.github.io/Pyt­honDataScienceHandbook/01­.02-shell-keyboard-shortcuts.html
  62. New terminal interface
    https://ipython.readthedoc­s.io/en/stable/whatsnew/ver­sion5.html#new-terminal-interface
  63. prompt-toolkit
    https://python-prompt-toolkit.readthedocs.io/en/stable/
  64. Tvorba aplikací s příkazovým řádkem v Pythonu s knihovnami GNU Readline a prompt_toolkit
    https://www.root.cz/clanky/tvorba-aplikaci-s-prikazovym-radkem-v-pythonu-s-vyuzitim-knihoven-gnu-readline-a-prompt-toolkit/
  65. Tvorba aplikací s textovým uživatelským rozhraním založeným na knihovně prompt_toolkit
    https://www.root.cz/clanky/tvorba-aplikaci-s-textovym-uzivatelskym-rozhranim-zalozenym-na-knihovne-prompt-toolkit/
  66. Tvorba textového rozhraní s knihovnou prompt_toolkit: základní prvky TUI
    https://www.root.cz/clanky/tvorba-textoveho-rozhrani-s-knihovnou-prompt-toolkit-zakladni-prvky-tui/
  67. Tvorba TUI s knihovnou prompt_toolkit: aplikace s celoobrazovkovým rozhraním
    https://www.root.cz/clanky/tvorba-tui-s-knihovnou-prompt-toolkit-aplikace-s-celoobrazovkovym-rozhranim/

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.