click

Nechme internety na chvíli být a pojďme se podívat na úplně jinou knihovnu, click.

Knihovna click slouží k vytváření rozhraní pro příkazovou řádku (angl. command line interface, CLI). Primárně to je zpracování argumentů, ale click umí zjednodušit i výstup.

Click je dobré používat s knihovnou colorama, která se stará o obarvování textu na příkazové řádce ve Windows (a na Unixu nedělá nic). Nainstalujte si tedy obě:

$ python -m pip install click colorama

Argumenty příkazové řádky

Nástroje na zpracování argumentů z CLI jsou i přímo ve standardní knihovně, a dokonce jich není málo: os.environ, argparse, optparse, getopt. S knihovnou click je ale práce mnohem příjemnější a výsledky většinou lépe odpovídají zavedeným konvencím.

Cena za jednoduchost a konzistenci je, že některé styly návrhu CLI click nepodporuje. Máte-li existující rozhraní, které chcete jen převést do Pythonu, click nejspíš nebude nejlepší volba.

Takto jednoduše se dá vytvořit aplikace s přepínači:

import click

@click.command()
@click.option('--count', default=1,  metavar='COUNT',
              help='Number of greetings.')
@click.option('--name', prompt='Your name', metavar='NAME',
              help='The person to greet.')
def hello(count, name):
    """Simple program that greets NAME for a total of COUNT times."""
    for x in range(count):
        click.echo('Hello {}!'.format(name))

if __name__ == '__main__':
    hello()

Vyzkoušejte si ji! Máte-li ji uloženou jako hello.py, zkuste:

$ python hello.py
$ python hello.py --help
$ python hello.py --name Pythonista
$ python hello.py --count 5

Příkazy a přepínače

Funkce s dekorátorem @click.command je příkaz – když ji zavoláte, click zpracuje argumenty příkazové řádky a zavolá původní funkci s příslušnými pythonními hodnotami. Proto se dává do bloku if __name__ == '__main__':, který se spustí, jen když se pythonní soubor spoustí „přímo“. Když je soubor importován, tenhle blok se neprovede.

Dekorátory @click.option a @click.argument pak přidávají přepínače a argumenty.

Přepínače (angl. options), přidávané pomocí option, jsou nepovinné parametry, kterými se nějak obměňuje chování programu. Pokud uživatel nějaký přepínač nezadá, použije se hodnota zadaná jako default (nebo None, když default chybí).

Podle default se řídí i typ argumentu, není-li dán explicitně. Takže count v příkladu výše je celé číslo.

Jména přepínačů začínají, podle Unixové konvence, pomlčkami: jednou pomlčkou pro jednopísmenné zkratky, dvěma pomlčkami pro vícepísmenná jména. Jeden přepínač může mít i víc jmen.

Speciální případ jsou booleovské přepínače, které mají jedno jméno pro True a jiné pro False.

import click

@click.command()
@click.option('-n', '--name', default='world',
              help='Name of the person to greet')
@click.option('-c/-C', '--color/--no-color',
              help='Make the output colorful')
def hello(name, color):
    if color:
        name = click.style(name, fg='blue')
    click.echo('Hello {}!'.format(name))

if __name__ == '__main__':
    hello()
$ python hello.py
Hello world!
$ python hello.py --name Guido
Hello Guido!
$ python hello.py -n 'Mr. Git'
Hello Mr. Git!
$ python hello.py --help
Usage: hello.py [OPTIONS]

Options:
  -n, --name TEXT               Name of the person to greet
  -c, --color / -C, --no-color  Make the output colorful
  --help                        Show this message and exit.

Přepínač --help přidává click sám.

Argumenty

Kromě přepínačů podporuje click i argumenty. Přepínače musí uživatel na řádce pojmenovat; argumenty se zadávají pozičně. Používají se ve dvou případech: pro povinné informace a pro argumenty, kterých může být libovolný počet. Na všechno ostatní radši použijte přepínače.

@click.command()
@click.argument('directory')
def cd(directory):
    """Change the current directory"""
    click.echo('Changing to directory {}'.format(directory))

@click.command()
@click.argument('source', nargs=-1)
@click.argument('destination', nargs=1)
def mv(source, destination):
    """Move any number of files to one destination"""
    for filename in source:
        click.echo('Moving {} to {}'.format(filename, destination))

Soubory

Má-li uživatel zadat jméno souboru, nepoužívejte řetězce, ale speciální typ click.File(). Click za vás soubor automaticky otevře a zavře. Kromě toho podporuje unixovskou konvenci, že - znamená standardní vstup/výstup.

Argument pro File je mód, ve kterém se soubor otevírá, podobně jako pro funkci open: 'r' pro čtení, 'w' pro zápis.

@click.command()
@click.argument('files', nargs=-1, type=click.File('r'))
def cat(files):
    """Print out the contents of the given files"""
    for file in files:
        print(file.read(), end='')

Existuje i varianta click.Path(), která soubor neotvírá. Pomocí ní jde např. zadat jméno adresáře.

Podpříkazy

Click má dobrou podporu pro podpříkazy známé z verzovacích systémů jako git: příkaz git sám o sobě nedělá nic, jen sdružuje podpříkazy jako git add a git commit.

Umí-li váš program více akcí, souhrnný příkaz označte @click.group() a jednotlivé podpříkazy pak přidávejte pomocí command():

@click.group()
def git2():
    pass

@git2.command()
def commit():
    message = click.edit('Made some changes')
    click.echo('Making commit with message: {}'.format(message))

@git2.command()
@click.argument('files', nargs=-1)
def add(files):
    for file in files:
        click.echo('Adding {}'.format(file))

A další

Tahle lekce není popis všeho, co click umí – je to jen ochutnávka, abyste věděli, co od téhle knihovny očekávat.

Click má velice dobrou dokumentaci, ve které najdete detaily i všechny ostatní možnosti.

{
  "data": {
    "sessionMaterial": {
      "id": "session-material:2017/mipyt-kam:requests-click:2",
      "title": "Click – Rozhraní pro příkazovou řádku",
      "html": "\n          \n    \n\n    <h1>click</h1>\n<p>Nechme internety na chv&#xED;li b&#xFD;t a poj&#x10F;me se pod&#xED;vat na &#xFA;pln&#x11B; jinou knihovnu,\n<a href=\"http://click.pocoo.org/6/\">click</a>.</p>\n<p>Knihovna <code>click</code> slou&#x17E;&#xED; k&#xA0;vytv&#xE1;&#x159;en&#xED; rozhran&#xED; pro p&#x159;&#xED;kazovou &#x159;&#xE1;dku\n(angl. <em>command line interface</em>, CLI).\nPrim&#xE1;rn&#x11B; to je zpracov&#xE1;n&#xED; argument&#x16F;, ale click um&#xED; zjednodu&#x161;it i v&#xFD;stup.</p>\n<p>Click je dobr&#xE9; pou&#x17E;&#xED;vat s knihovnou <code>colorama</code>, kter&#xE1; se star&#xE1; o obarvov&#xE1;n&#xED;\ntextu na p&#x159;&#xED;kazov&#xE9; &#x159;&#xE1;dce ve Windows (a na Unixu ned&#x11B;l&#xE1; nic).\nNainstalujte si tedy ob&#x11B;:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>python -m pip install click colorama\n</pre></div><h2>Argumenty p&#x159;&#xED;kazov&#xE9; &#x159;&#xE1;dky</h2>\n<p>N&#xE1;stroje na zpracov&#xE1;n&#xED; argument&#x16F; z&#xA0;CLI jsou i p&#x159;&#xED;mo ve standardn&#xED; knihovn&#x11B;,\na dokonce jich nen&#xED; m&#xE1;lo: <a href=\"https://docs.python.org/3/library/os.html#os.environ\">os.environ</a>, <a href=\"https://docs.python.org/3/library/argparse.html\">argparse</a>, <a href=\"https://docs.python.org/3/library/optparse.html\">optparse</a>, <a href=\"https://docs.python.org/3/library/getopt.html\">getopt</a>.\nS&#xA0;knihovnou <code>click</code> je ale pr&#xE1;ce mnohem p&#x159;&#xED;jemn&#x11B;j&#x161;&#xED; a v&#xFD;sledky v&#x11B;t&#x161;inou\nl&#xE9;pe odpov&#xED;daj&#xED; zaveden&#xFD;m konvenc&#xED;m.</p>\n<div class=\"admonition note\"><p>Cena za jednoduchost a konzistenci je, &#x17E;e n&#x11B;kter&#xE9; styly n&#xE1;vrhu CLI click\nnepodporuje.\nM&#xE1;te-li existuj&#xED;c&#xED; rozhran&#xED;, kter&#xE9; chcete jen p&#x159;ev&#xE9;st do Pythonu,\nclick nejsp&#xED;&#x161; nebude nejlep&#x161;&#xED; volba.</p>\n</div><p>Takto jednodu&#x161;e se d&#xE1; vytvo&#x159;it aplikace s&#xA0;p&#x159;ep&#xED;na&#x10D;i:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">import</span> <span class=\"nn\">click</span>\n\n<span class=\"nd\">@click.command</span><span class=\"p\">()</span>\n<span class=\"nd\">@click.option</span><span class=\"p\">(</span><span class=\"s1\">&apos;--count&apos;</span><span class=\"p\">,</span> <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>  <span class=\"n\">metavar</span><span class=\"o\">=</span><span class=\"s1\">&apos;COUNT&apos;</span><span class=\"p\">,</span>\n              <span class=\"n\">help</span><span class=\"o\">=</span><span class=\"s1\">&apos;Number of greetings.&apos;</span><span class=\"p\">)</span>\n<span class=\"nd\">@click.option</span><span class=\"p\">(</span><span class=\"s1\">&apos;--name&apos;</span><span class=\"p\">,</span> <span class=\"n\">prompt</span><span class=\"o\">=</span><span class=\"s1\">&apos;Your name&apos;</span><span class=\"p\">,</span> <span class=\"n\">metavar</span><span class=\"o\">=</span><span class=\"s1\">&apos;NAME&apos;</span><span class=\"p\">,</span>\n              <span class=\"n\">help</span><span class=\"o\">=</span><span class=\"s1\">&apos;The person to greet.&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">hello</span><span class=\"p\">(</span><span class=\"n\">count</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Simple program that greets NAME for a total of COUNT times.&quot;&quot;&quot;</span>\n    <span class=\"k\">for</span> <span class=\"n\">x</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">count</span><span class=\"p\">):</span>\n        <span class=\"n\">click</span><span class=\"o\">.</span><span class=\"n\">echo</span><span class=\"p\">(</span><span class=\"s1\">&apos;Hello {}!&apos;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"p\">))</span>\n\n<span class=\"k\">if</span> <span class=\"vm\">__name__</span> <span class=\"o\">==</span> <span class=\"s1\">&apos;__main__&apos;</span><span class=\"p\">:</span>\n    <span class=\"n\">hello</span><span class=\"p\">()</span>\n</pre></div><p>Vyzkou&#x161;ejte si ji! M&#xE1;te-li ji ulo&#x17E;enou jako <code>hello.py</code>, zkuste:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>python hello.py\n<span class=\"gp\">$ </span>python hello.py --help\n<span class=\"gp\">$ </span>python hello.py --name Pythonista\n<span class=\"gp\">$ </span>python hello.py --count <span class=\"m\">5</span>\n</pre></div><h2>P&#x159;&#xED;kazy a p&#x159;ep&#xED;na&#x10D;e</h2>\n<p>Funkce s&#xA0;dekor&#xE1;torem <code>@click.command</code> je <em>p&#x159;&#xED;kaz</em> &#x2013; kdy&#x17E; ji zavol&#xE1;te,\nclick zpracuje argumenty p&#x159;&#xED;kazov&#xE9; &#x159;&#xE1;dky a zavol&#xE1; p&#x16F;vodn&#xED; funkci\ns&#xA0;p&#x159;&#xED;slu&#x161;n&#xFD;mi pythonn&#xED;mi hodnotami.\nProto se d&#xE1;v&#xE1; do bloku <code>if __name__ == &apos;__main__&apos;:</code>, kter&#xFD; se spust&#xED;, jen\nkdy&#x17E; se pythonn&#xED; soubor spoust&#xED; &#x201E;p&#x159;&#xED;mo&#x201C;.\nKdy&#x17E; je soubor importov&#xE1;n, tenhle blok se neprovede.</p>\n<p>Dekor&#xE1;tory <code>@click.option</code> a <code>@click.argument</code> pak p&#x159;id&#xE1;vaj&#xED; p&#x159;ep&#xED;na&#x10D;e\na argumenty.</p>\n<p><em>P&#x159;ep&#xED;na&#x10D;e</em> (angl. <em>options</em>), p&#x159;id&#xE1;van&#xE9; pomoc&#xED; <code>option</code>, jsou nepovinn&#xE9;\nparametry, kter&#xFD;mi se n&#x11B;jak obm&#x11B;&#x148;uje chov&#xE1;n&#xED; programu.\nPokud u&#x17E;ivatel n&#x11B;jak&#xFD; p&#x159;ep&#xED;na&#x10D; nezad&#xE1;, pou&#x17E;ije se hodnota zadan&#xE1; jako <code>default</code>\n(nebo <code>None</code>, kdy&#x17E; <code>default</code> chyb&#xED;).</p>\n<p>Podle <code>default</code> se &#x159;&#xED;d&#xED; i typ argumentu, nen&#xED;-li d&#xE1;n explicitn&#x11B;.\nTak&#x17E;e <code>count</code> v&#xA0;p&#x159;&#xED;kladu v&#xFD;&#x161;e je cel&#xE9; &#x10D;&#xED;slo.</p>\n<p>Jm&#xE9;na p&#x159;ep&#xED;na&#x10D;&#x16F; za&#x10D;&#xED;naj&#xED;, podle Unixov&#xE9; konvence, poml&#x10D;kami: jednou poml&#x10D;kou\npro jednop&#xED;smenn&#xE9; zkratky, dv&#x11B;ma poml&#x10D;kami pro v&#xED;cep&#xED;smenn&#xE1; jm&#xE9;na.\nJeden p&#x159;ep&#xED;na&#x10D; m&#x16F;&#x17E;e m&#xED;t i v&#xED;c jmen.</p>\n<p>Speci&#xE1;ln&#xED; p&#x159;&#xED;pad jsou booleovsk&#xE9; p&#x159;ep&#xED;na&#x10D;e, kter&#xE9; maj&#xED; jedno jm&#xE9;no\npro <code>True</code> a jin&#xE9; pro <code>False</code>.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"kn\">import</span> <span class=\"nn\">click</span>\n\n<span class=\"nd\">@click.command</span><span class=\"p\">()</span>\n<span class=\"nd\">@click.option</span><span class=\"p\">(</span><span class=\"s1\">&apos;-n&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;--name&apos;</span><span class=\"p\">,</span> <span class=\"n\">default</span><span class=\"o\">=</span><span class=\"s1\">&apos;world&apos;</span><span class=\"p\">,</span>\n              <span class=\"n\">help</span><span class=\"o\">=</span><span class=\"s1\">&apos;Name of the person to greet&apos;</span><span class=\"p\">)</span>\n<span class=\"nd\">@click.option</span><span class=\"p\">(</span><span class=\"s1\">&apos;-c/-C&apos;</span><span class=\"p\">,</span> <span class=\"s1\">&apos;--color/--no-color&apos;</span><span class=\"p\">,</span>\n              <span class=\"n\">help</span><span class=\"o\">=</span><span class=\"s1\">&apos;Make the output colorful&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">hello</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">color</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">color</span><span class=\"p\">:</span>\n        <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">click</span><span class=\"o\">.</span><span class=\"n\">style</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">fg</span><span class=\"o\">=</span><span class=\"s1\">&apos;blue&apos;</span><span class=\"p\">)</span>\n    <span class=\"n\">click</span><span class=\"o\">.</span><span class=\"n\">echo</span><span class=\"p\">(</span><span class=\"s1\">&apos;Hello {}!&apos;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"p\">))</span>\n\n<span class=\"k\">if</span> <span class=\"vm\">__name__</span> <span class=\"o\">==</span> <span class=\"s1\">&apos;__main__&apos;</span><span class=\"p\">:</span>\n    <span class=\"n\">hello</span><span class=\"p\">()</span>\n</pre></div><div class=\"highlight\"><pre><span></span><span class=\"gp\">$ </span>python hello.py\n<span class=\"go\">Hello world!</span>\n<span class=\"gp\">$ </span>python hello.py --name Guido\n<span class=\"go\">Hello Guido!</span>\n<span class=\"gp\">$ </span>python hello.py -n <span class=\"s1\">&apos;Mr. Git&apos;</span>\n<span class=\"go\">Hello Mr. Git!</span>\n<span class=\"gp\">$ </span>python hello.py --help\n<span class=\"go\">Usage: hello.py [OPTIONS]</span>\n\n<span class=\"go\">Options:</span>\n<span class=\"go\">  -n, --name TEXT               Name of the person to greet</span>\n<span class=\"go\">  -c, --color / -C, --no-color  Make the output colorful</span>\n<span class=\"go\">  --help                        Show this message and exit.</span>\n</pre></div><p>P&#x159;ep&#xED;na&#x10D; <code>--help</code> p&#x159;id&#xE1;v&#xE1; click s&#xE1;m.</p>\n<h2>Argumenty</h2>\n<p>Krom&#x11B; p&#x159;ep&#xED;na&#x10D;&#x16F; podporuje click i <em>argumenty</em>.\nP&#x159;ep&#xED;na&#x10D;e mus&#xED; u&#x17E;ivatel na &#x159;&#xE1;dce pojmenovat; argumenty se zad&#xE1;vaj&#xED; pozi&#x10D;n&#x11B;.\nPou&#x17E;&#xED;vaj&#xED; se ve dvou p&#x159;&#xED;padech: pro povinn&#xE9; informace a pro argumenty, kter&#xFD;ch\nm&#x16F;&#x17E;e b&#xFD;t libovoln&#xFD; po&#x10D;et.\nNa v&#x161;echno ostatn&#xED; rad&#x161;i pou&#x17E;ijte p&#x159;ep&#xED;na&#x10D;e.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"nd\">@click.command</span><span class=\"p\">()</span>\n<span class=\"nd\">@click.argument</span><span class=\"p\">(</span><span class=\"s1\">&apos;directory&apos;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">cd</span><span class=\"p\">(</span><span class=\"n\">directory</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Change the current directory&quot;&quot;&quot;</span>\n    <span class=\"n\">click</span><span class=\"o\">.</span><span class=\"n\">echo</span><span class=\"p\">(</span><span class=\"s1\">&apos;Changing to directory {}&apos;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">directory</span><span class=\"p\">))</span>\n\n<span class=\"nd\">@click.command</span><span class=\"p\">()</span>\n<span class=\"nd\">@click.argument</span><span class=\"p\">(</span><span class=\"s1\">&apos;source&apos;</span><span class=\"p\">,</span> <span class=\"n\">nargs</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"nd\">@click.argument</span><span class=\"p\">(</span><span class=\"s1\">&apos;destination&apos;</span><span class=\"p\">,</span> <span class=\"n\">nargs</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">mv</span><span class=\"p\">(</span><span class=\"n\">source</span><span class=\"p\">,</span> <span class=\"n\">destination</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Move any number of files to one destination&quot;&quot;&quot;</span>\n    <span class=\"k\">for</span> <span class=\"n\">filename</span> <span class=\"ow\">in</span> <span class=\"n\">source</span><span class=\"p\">:</span>\n        <span class=\"n\">click</span><span class=\"o\">.</span><span class=\"n\">echo</span><span class=\"p\">(</span><span class=\"s1\">&apos;Moving {} to {}&apos;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">filename</span><span class=\"p\">,</span> <span class=\"n\">destination</span><span class=\"p\">))</span>\n</pre></div><h2>Soubory</h2>\n<p>M&#xE1;-li u&#x17E;ivatel zadat jm&#xE9;no souboru, nepou&#x17E;&#xED;vejte &#x159;et&#x11B;zce, ale speci&#xE1;ln&#xED; typ\n<a href=\"http://click.pocoo.org/6/api/#click.File\"><code>click.File()</code></a>.\nClick za v&#xE1;s soubor automaticky otev&#x159;e a zav&#x159;e.\nKrom&#x11B; toho podporuje unixovskou konvenci, &#x17E;e <code>-</code> znamen&#xE1; standardn&#xED;\nvstup/v&#xFD;stup.</p>\n<p>Argument pro <code>File</code> je m&#xF3;d, ve kter&#xE9;m se soubor otev&#xED;r&#xE1;, podobn&#x11B; jako pro\nfunkci <a href=\"https://docs.python.org/3/library/functions.html#open\"><code>open</code></a>:\n<code>&apos;r&apos;</code> pro &#x10D;ten&#xED;, <code>&apos;w&apos;</code> pro z&#xE1;pis.</p>\n<div class=\"highlight\"><pre><span></span><span class=\"nd\">@click.command</span><span class=\"p\">()</span>\n<span class=\"nd\">@click.argument</span><span class=\"p\">(</span><span class=\"s1\">&apos;files&apos;</span><span class=\"p\">,</span> <span class=\"n\">nargs</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"nb\">type</span><span class=\"o\">=</span><span class=\"n\">click</span><span class=\"o\">.</span><span class=\"n\">File</span><span class=\"p\">(</span><span class=\"s1\">&apos;r&apos;</span><span class=\"p\">))</span>\n<span class=\"k\">def</span> <span class=\"nf\">cat</span><span class=\"p\">(</span><span class=\"n\">files</span><span class=\"p\">):</span>\n    <span class=\"sd\">&quot;&quot;&quot;Print out the contents of the given files&quot;&quot;&quot;</span>\n    <span class=\"k\">for</span> <span class=\"nb\">file</span> <span class=\"ow\">in</span> <span class=\"n\">files</span><span class=\"p\">:</span>\n        <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"nb\">file</span><span class=\"o\">.</span><span class=\"n\">read</span><span class=\"p\">(),</span> <span class=\"n\">end</span><span class=\"o\">=</span><span class=\"s1\">&apos;&apos;</span><span class=\"p\">)</span>\n</pre></div><p>Existuje i varianta <a href=\"http://click.pocoo.org/6/api/#click.Path\"><code>click.Path()</code></a>,\nkter&#xE1; soubor neotv&#xED;r&#xE1;. Pomoc&#xED; n&#xED; jde nap&#x159;. zadat jm&#xE9;no adres&#xE1;&#x159;e.</p>\n<h2>Podp&#x159;&#xED;kazy</h2>\n<p>Click m&#xE1; dobrou podporu pro <em>podp&#x159;&#xED;kazy</em> zn&#xE1;m&#xE9; z&#xA0;verzovac&#xED;ch syst&#xE9;m&#x16F; jako git:\np&#x159;&#xED;kaz <code>git</code> s&#xE1;m o sob&#x11B; ned&#x11B;l&#xE1; nic, jen sdru&#x17E;uje podp&#x159;&#xED;kazy jako <code>git add</code>\na <code>git commit</code>.</p>\n<p>Um&#xED;-li v&#xE1;&#x161; program v&#xED;ce akc&#xED;, souhrnn&#xFD; p&#x159;&#xED;kaz ozna&#x10D;te <code>@click.group()</code>\na jednotliv&#xE9; podp&#x159;&#xED;kazy pak p&#x159;id&#xE1;vejte pomoc&#xED; <code>command()</code>:</p>\n<div class=\"highlight\"><pre><span></span><span class=\"nd\">@click.group</span><span class=\"p\">()</span>\n<span class=\"k\">def</span> <span class=\"nf\">git2</span><span class=\"p\">():</span>\n    <span class=\"k\">pass</span>\n\n<span class=\"nd\">@git2.command</span><span class=\"p\">()</span>\n<span class=\"k\">def</span> <span class=\"nf\">commit</span><span class=\"p\">():</span>\n    <span class=\"n\">message</span> <span class=\"o\">=</span> <span class=\"n\">click</span><span class=\"o\">.</span><span class=\"n\">edit</span><span class=\"p\">(</span><span class=\"s1\">&apos;Made some changes&apos;</span><span class=\"p\">)</span>\n    <span class=\"n\">click</span><span class=\"o\">.</span><span class=\"n\">echo</span><span class=\"p\">(</span><span class=\"s1\">&apos;Making commit with message: {}&apos;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">message</span><span class=\"p\">))</span>\n\n<span class=\"nd\">@git2.command</span><span class=\"p\">()</span>\n<span class=\"nd\">@click.argument</span><span class=\"p\">(</span><span class=\"s1\">&apos;files&apos;</span><span class=\"p\">,</span> <span class=\"n\">nargs</span><span class=\"o\">=-</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">add</span><span class=\"p\">(</span><span class=\"n\">files</span><span class=\"p\">):</span>\n    <span class=\"k\">for</span> <span class=\"nb\">file</span> <span class=\"ow\">in</span> <span class=\"n\">files</span><span class=\"p\">:</span>\n        <span class=\"n\">click</span><span class=\"o\">.</span><span class=\"n\">echo</span><span class=\"p\">(</span><span class=\"s1\">&apos;Adding {}&apos;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"nb\">file</span><span class=\"p\">))</span>\n</pre></div><h2>A dal&#x161;&#xED;</h2>\n<p>Tahle lekce nen&#xED; popis v&#x161;eho, co click um&#xED; &#x2013; je to jen ochutn&#xE1;vka,\nabyste v&#x11B;d&#x11B;li, co od t&#xE9;hle knihovny o&#x10D;ek&#xE1;vat.</p>\n<p>Click m&#xE1; velice dobrou <a href=\"http://click.pocoo.org/6/\">dokumentaci</a>, ve kter&#xE9; najdete detaily i v&#x161;echny\nostatn&#xED; mo&#x17E;nosti.</p>\n\n\n        "
    }
  }
}