<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>quiCkLI Blog</title>
        <link>https://spmse.github.io/quickli/de/blog</link>
        <description>News, tutorials, and deep dives from the quiCkLI project.</description>
        <lastBuildDate>Fri, 31 Jul 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>de</language>
        <copyright>Copyright © 2026 quiCkLI contributors.</copyright>
        <item>
            <title><![CDATA[Introducing quiCkLI]]></title>
            <link>https://spmse.github.io/quickli/de/blog/2026/07/31/introducing-quickli</link>
            <guid>https://spmse.github.io/quickli/de/blog/2026/07/31/introducing-quickli</guid>
            <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[What quiCkLI is, who it is for, and what to expect from this blog.]]></description>
            <content:encoded><![CDATA[<p>quiCkLI is a small, educational Python framework for building command-line applications.
It keeps registration, parsing, validation, dispatch, and help visible so developers can
learn how CLI tools fit together.</p>
<!-- -->
<p>This blog will combine practical tutorials, design notes, comparisons, and reflections on
where command-line applications remain useful. The goal is to make CLI development easier
to understand and more enjoyable to explore.</p>
<div class="theme-admonition theme-admonition-tip admonition_Qx6W alert alert--success"><div class="admonitionHeading_S1FI"><span class="admonitionIcon_VL2H"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tipp</div><div class="admonitionContent_PclH"><p>Start with the <a class="" href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-01-hello-world">Getting Started series</a> if you want
to build something immediately.</p></div></div>]]></content:encoded>
            <category>General</category>
            <category>quickli</category>
            <category>introduction</category>
        </item>
        <item>
            <title><![CDATA[Erste Schritte mit quiCkLI: Deine erste Kommandozeilenanwendung]]></title>
            <link>https://spmse.github.io/quickli/de/blog/quickli-tutorial-01-hello-world</link>
            <guid>https://spmse.github.io/quickli/de/blog/quickli-tutorial-01-hello-world</guid>
            <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Erstelle deine erste Python-Kommandozeilenanwendung mit quiCkLI in unter fünf Minuten. Dieses Tutorial behandelt Application, Argument und Option  -  die drei Grundbausteine, die du zum Einstieg brauchst.
]]></description>
            <content:encoded><![CDATA[<p>Wenn du schon immer ein kleines Python-Kommandozeilentool erstellen wolltest, aber
größere Frameworks überwältigend fandest, wurde <code>quiCkLI</code> für dich entwickelt. Es ist ein
minimales Framework, das die Grundbausteine sichtbar lässt  -  damit du lernen und bauen
kannst, ohne unnötige Komplexität.</p>
<p>Im ersten Artikel der Reihe <em>Erste Schritte mit quiCkLI</em> wirst du ein Begrüßungstool
mit genau drei Konzepten erstellen: <code>Application</code>, <code>Argument</code> und <code>Option</code>.</p>
<!-- -->
<aside class="blog-series-navigation" aria-label="Serie"><p><strong>Erste Schritte mit quiCkLI</strong></p><p>Teil 1 von 3</p><ol><li aria-current="page"><a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-01-hello-world">1<!-- -->. <!-- -->Deine erste Kommandozeilenanwendung</a></li><li><a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-02-file-tools">2<!-- -->. <!-- -->Dateien lesen und Eingaben validieren</a></li><li><a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-03-multi-command-cli">3<!-- -->. <!-- -->Multi-Command-Anwendungen</a></li></ol><p><a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-02-file-tools">Weiter<!-- --> →</a></p><p><a href="https://spmse.github.io/quickli/de/blog/series">Alle Blog-Serien anzeigen</a></p></aside>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="was-du-bauen-wirst">Was du bauen wirst<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-01-hello-world#was-du-bauen-wirst" class="hash-link" aria-label="Direkter Link zur Was du bauen wirst" title="Direkter Link zur Was du bauen wirst" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Dek1 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QEAE"><pre tabindex="0" class="prism-code language-bash codeBlock_OciL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines__6Ls"><div class="token-line" style="color:#393A34"><span class="token plain">$ python hello.py Ada</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ Hello, Ada</span><span class="token operator" style="color:#393A34">!</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ python hello.py Ada </span><span class="token parameter variable" style="color:#36acaa">--uppercase</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ HELLO, ADA</span><span class="token operator" style="color:#393A34">!</span><br></div></code></pre></div></div>
<p>Eine einzige Datei. Keine Konfiguration. Unter dreißig Zeilen Python.</p>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="voraussetzungen">Voraussetzungen<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-01-hello-world#voraussetzungen" class="hash-link" aria-label="Direkter Link zur Voraussetzungen" title="Direkter Link zur Voraussetzungen" translate="no">​</a></h2>
<p>Installiere quickli in einer virtuellen Umgebung:</p>
<div class="language-bash codeBlockContainer_Dek1 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QEAE"><pre tabindex="0" class="prism-code language-bash codeBlock_OciL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines__6Ls"><div class="token-line" style="color:#393A34"><span class="token plain">$ python </span><span class="token parameter variable" style="color:#36acaa">-m</span><span class="token plain"> venv .venv</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token builtin class-name">source</span><span class="token plain"> .venv/bin/activate   </span><span class="token comment" style="color:#999988;font-style:italic"># Windows: .venv\Scripts\activate</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ pip </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> quickli</span><br></div></code></pre></div></div>
<p>Du benötigst Python 3.12 oder neuer.</p>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="schritt-1-die-anwendung-erstellen">Schritt 1: Die Anwendung erstellen<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-01-hello-world#schritt-1-die-anwendung-erstellen" class="hash-link" aria-label="Direkter Link zur Schritt 1: Die Anwendung erstellen" title="Direkter Link zur Schritt 1: Die Anwendung erstellen" translate="no">​</a></h2>
<div class="language-python codeBlockContainer_Dek1 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QEAE"><pre tabindex="0" class="prism-code language-python codeBlock_OciL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines__6Ls"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> quickli </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Application</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">app </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Application</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"hello"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    description</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Grüße eine Person von der Kommandozeile."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p><code>Application</code> ist der Wurzel-Container. Er verwaltet Registrierung und Dispatch. Du
gibst ihm einen Namen (für die Hilfsausgabe) und eine kurze Beschreibung.</p>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="schritt-2-einen-handler-registrieren">Schritt 2: Einen Handler registrieren<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-01-hello-world#schritt-2-einen-handler-registrieren" class="hash-link" aria-label="Direkter Link zur Schritt 2: Einen Handler registrieren" title="Direkter Link zur Schritt 2: Einen Handler registrieren" translate="no">​</a></h2>
<div class="language-python codeBlockContainer_Dek1 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QEAE"><pre tabindex="0" class="prism-code language-python codeBlock_OciL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines__6Ls"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> quickli </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Application</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Argument</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Option</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#393A34">@app</span><span class="token decorator annotation punctuation" style="color:#393A34">.</span><span class="token decorator annotation punctuation" style="color:#393A34">entrypoint</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    help_text</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Einen Gruß ausgeben."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    arguments</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Argument</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"name"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> help_text</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Name, der gegrüßt werden soll."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    options</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Option</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">"uppercase"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            short_name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"u"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            is_flag</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            help_text</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Den Gruß in Großbuchstaben ausgeben."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">greet</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> uppercase</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">bool</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">False</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    message </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#e3116c">f"Hello, </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">!"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> message</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">upper</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> uppercase </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> message</span><br></div></code></pre></div></div>
<p><code>@app.entrypoint</code> registriert eine Funktion als einzelnen Handler für diese Anwendung.</p>
<ul>
<li class=""><code>Argument("name")</code> deklariert einen erforderlichen Positionswert.</li>
<li class=""><code>Option("uppercase", is_flag=True)</code> deklariert einen booleschen Schalter.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="schritt-3-die-anwendung-ausführen">Schritt 3: Die Anwendung ausführen<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-01-hello-world#schritt-3-die-anwendung-ausf%C3%BChren" class="hash-link" aria-label="Direkter Link zur Schritt 3: Die Anwendung ausführen" title="Direkter Link zur Schritt 3: Die Anwendung ausführen" translate="no">​</a></h2>
<div class="language-python codeBlockContainer_Dek1 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QEAE"><pre tabindex="0" class="prism-code language-python codeBlock_OciL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines__6Ls"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> __name__ </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"__main__"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p><code>Application.run()</code> liest standardmäßig <code>sys.argv[1:]</code> und gibt das Handler-Ergebnis
zurück. Du entscheidest, was damit zu tun ist.</p>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="die-vollständige-datei">Die vollständige Datei<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-01-hello-world#die-vollst%C3%A4ndige-datei" class="hash-link" aria-label="Direkter Link zur Die vollständige Datei" title="Direkter Link zur Die vollständige Datei" translate="no">​</a></h2>
<div class="language-python codeBlockContainer_Dek1 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QEAE"><pre tabindex="0" class="prism-code language-python codeBlock_OciL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines__6Ls"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> __future__ </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> annotations</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> quickli </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Application</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Argument</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Option</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">app </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Application</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"hello"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    description</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Grüße eine Person von der Kommandozeile."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#393A34">@app</span><span class="token decorator annotation punctuation" style="color:#393A34">.</span><span class="token decorator annotation punctuation" style="color:#393A34">entrypoint</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    help_text</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Einen Gruß ausgeben."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    arguments</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Argument</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"name"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> help_text</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Name, der gegrüßt werden soll."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    options</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Option</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">"uppercase"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            short_name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"u"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            is_flag</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            help_text</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Den Gruß in Großbuchstaben ausgeben."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">greet</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> uppercase</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">bool</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">False</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    message </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#e3116c">f"Hello, </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">!"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> message</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">upper</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> uppercase </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> message</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> __name__ </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"__main__"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="probiere-es-aus">Probiere es aus<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-01-hello-world#probiere-es-aus" class="hash-link" aria-label="Direkter Link zur Probiere es aus" title="Direkter Link zur Probiere es aus" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Dek1 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QEAE"><pre tabindex="0" class="prism-code language-bash codeBlock_OciL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines__6Ls"><div class="token-line" style="color:#393A34"><span class="token plain">$ python hello.py Ada           </span><span class="token comment" style="color:#999988;font-style:italic"># Hello, Ada!</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ python hello.py Ada </span><span class="token parameter variable" style="color:#36acaa">-u</span><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># HELLO, ADA!</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ python hello.py               </span><span class="token comment" style="color:#999988;font-style:italic"># (Hilfsausgabe)</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="was-du-gelernt-hast">Was du gelernt hast<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-01-hello-world#was-du-gelernt-hast" class="hash-link" aria-label="Direkter Link zur Was du gelernt hast" title="Direkter Link zur Was du gelernt hast" translate="no">​</a></h2>
<ul>
<li class=""><code>Application</code> verwaltet Registrierung und Dispatch.</li>
<li class=""><code>@app.entrypoint</code> registriert einen einzelnen Handler für die gesamte Anwendung.</li>
<li class=""><code>Argument</code> beschreibt positionalen, erforderlichen Input.</li>
<li class=""><code>Option</code> mit <code>is_flag=True</code> fügt einen booleschen Schalter hinzu.</li>
<li class=""><code>Application.run(argv)</code> gibt das Ergebnis zurück  -  du steuerst die Ausgabe.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="weiter-in-dieser-reihe">Weiter in dieser Reihe<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-01-hello-world#weiter-in-dieser-reihe" class="hash-link" aria-label="Direkter Link zur Weiter in dieser Reihe" title="Direkter Link zur Weiter in dieser Reihe" translate="no">​</a></h2>
<p>Der nächste Artikel fügt <strong>Datei-Input</strong>, <strong>Validierung</strong> und <strong>globale Optionen</strong> hinzu,
indem er einen kleinen Datei-Viewer nach dem Vorbild des Unix-<code>cat</code>-Befehls baut.</p>
<p>📖 <a class="" href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-02-file-tools">Teil 2: Dateien lesen  -  das quickcat-Tool →</a></p>]]></content:encoded>
            <category>tutorial</category>
            <category>Getting Started</category>
            <category>quickli</category>
            <category>python</category>
            <category>cli</category>
        </item>
        <item>
            <title><![CDATA[quiCkLI entwickeln: Warum ich ein minimales CLI-Framework gebaut habe]]></title>
            <link>https://spmse.github.io/quickli/de/blog/building-quickli-01-motivation</link>
            <guid>https://spmse.github.io/quickli/de/blog/building-quickli-01-motivation</guid>
            <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Warum noch ein weiteres CLI-Framework? Dieser erste Beitrag der Reihe „quiCkLI entwickeln" erklärt die Motivation hinter dem Projekt, welches Problem es für Lernende löst und welche Designprinzipien jede Entscheidung leiten.
]]></description>
            <content:encoded><![CDATA[<p>Es gibt bereits ausgezeichnete Python-CLI-Frameworks. <code>argparse</code> ist in der
Standardbibliothek. <code>click</code> ist ausgereift und weit verbreitet. <code>typer</code> generiert
Interfaces aus Typ-Annotationen. Wenn diese existieren, warum dann noch eines bauen?</p>
<p>Dieser Beitrag beantwortet diese Frage ehrlich. Er ist der erste einer Reihe über die
Entwicklung von <code>quiCkLI</code>  -  was es ist, warum es existiert und wohin es geht.</p>
<!-- -->
<aside class="blog-series-navigation" aria-label="Serie"><p><strong>quiCkLI entwickeln</strong></p><p>Teil 1 von 2</p><ol><li aria-current="page"><a href="https://spmse.github.io/quickli/de/blog/building-quickli-01-motivation">1<!-- -->. <!-- -->Warum ich ein minimales CLI-Framework gestartet habe</a></li><li><a href="https://spmse.github.io/quickli/de/blog/building-quickli-02-target-audience">2<!-- -->. <!-- -->Für wen ist dieses Framework gedacht?</a></li></ol><p><a href="https://spmse.github.io/quickli/de/blog/building-quickli-02-target-audience">Weiter<!-- --> →</a></p><p><a href="https://spmse.github.io/quickli/de/blog/series">Alle Blog-Serien anzeigen</a></p></aside>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="die-lücke-die-ich-füllen-wollte">Die Lücke, die ich füllen wollte<a href="https://spmse.github.io/quickli/de/blog/building-quickli-01-motivation#die-l%C3%BCcke-die-ich-f%C3%BCllen-wollte" class="hash-link" aria-label="Direkter Link zur Die Lücke, die ich füllen wollte" title="Direkter Link zur Die Lücke, die ich füllen wollte" translate="no">​</a></h2>
<p>Ich wollte ein Framework, auf das ich einen Lernenden zeigen und sagen könnte: <em>Alle
wichtigen Teile sind hier sichtbar.</em> Wenn ich versuchte, mit einem bestehenden Framework
zu erklären, wie eine CLI-Anwendung funktioniert, stieß ich immer wieder auf dasselbe
Problem. Das Framework war gut darin, Komplexität zu verbergen  -  was für Produktionscode
großartig ist  -  aber genau dieses Verbergen machte es schwer zu verstehen, was tatsächlich
passiert.</p>
<p>Ich wollte keines dieser Tools ersetzen. Ich wollte etwas bauen, das als
Referenzimplementierung dienen kann  -  ein Framework, das klein genug ist, dass ein
Entwickler den gesamten Quellcode an einem Nachmittag lesen und verstehen kann, wie ein
CLI aus ersten Prinzipien zusammengesetzt wird.</p>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="was-minimal-hier-bedeutet">Was „minimal" hier bedeutet<a href="https://spmse.github.io/quickli/de/blog/building-quickli-01-motivation#was-minimal-hier-bedeutet" class="hash-link" aria-label="Direkter Link zur Was „minimal&quot; hier bedeutet" title="Direkter Link zur Was „minimal&quot; hier bedeutet" translate="no">​</a></h2>
<p><code>quickli</code> ist nicht minimal, weil es weniger Funktionen hat. Es ist minimal in dem Sinn,
dass jeder Teil des Designs bewusst und sichtbar ist.</p>
<ul>
<li class="">Der Anwendungs-Container verwaltet Registrierung und Dispatch. Diese Grenze ist explizit.</li>
<li class="">Argumente sind positional und geordnet. Optionen sind benannt. Das sind verschiedene
Dinge.</li>
<li class="">Konvertierung und Validierung sind separate Schritte, die vor dem Handler stattfinden.</li>
<li class="">Das Framework gibt Ergebnisse an den Aufrufer zurück. Es liest <code>sys.argv[1:]</code>
standardmäßig, druckt aber keine Ausgabe und behandelt keine Exit-Codes.</li>
</ul>
<p>Jede dieser Entscheidungen wurde getroffen, weil sie die Mechanik einer CLI für jemanden
sichtbar lässt, der lernt, wie sie funktioniert.</p>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="die-leitende-frage">Die leitende Frage<a href="https://spmse.github.io/quickli/de/blog/building-quickli-01-motivation#die-leitende-frage" class="hash-link" aria-label="Direkter Link zur Die leitende Frage" title="Direkter Link zur Die leitende Frage" translate="no">​</a></h2>
<p>Für jede Funktion, die ich in <code>quickli</code> hinzuzufügen überlegte, stellte ich dieselbe
Frage: <em>Macht das das Framework einfacher, davon zu lernen, oder macht es es mächtiger
auf Kosten des Verständnisses?</em></p>
<p>Diese Frage hat <code>quickli</code> klein gehalten.</p>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="was-als-nächstes-kommt">Was als Nächstes kommt<a href="https://spmse.github.io/quickli/de/blog/building-quickli-01-motivation#was-als-n%C3%A4chstes-kommt" class="hash-link" aria-label="Direkter Link zur Was als Nächstes kommt" title="Direkter Link zur Was als Nächstes kommt" translate="no">​</a></h2>
<p>Der nächste Beitrag in dieser Reihe befasst sich damit, für wen <code>quiCkLI</code> gedacht ist  -
die Zielgruppe und was ich hoffe, dass sie aus der Verwendung mitnehmen.</p>
<p>📖 <a class="" href="https://spmse.github.io/quickli/de/blog/building-quickli-02-target-audience">Teil 2: Für wen ist quiCkLI? →</a></p>]]></content:encoded>
            <category>Building quiCkLI</category>
            <category>meta</category>
            <category>motivation</category>
            <category>design</category>
            <category>quickli</category>
            <category>open-source</category>
        </item>
        <item>
            <title><![CDATA[Getting Started with quiCkLI: Designing CLI Applications]]></title>
            <link>https://spmse.github.io/quickli/de/blog/2026/08/11/designing-cli-apps</link>
            <guid>https://spmse.github.io/quickli/de/blog/2026/08/11/designing-cli-apps</guid>
            <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The challenges, opportunities, and caveats involved in designing a CLI application.]]></description>
            <content:encoded><![CDATA[<p>Designing a CLI is more than mapping strings to functions. You need to decide how users
discover commands, provide values, recover from mistakes, and compose tools in scripts.</p>
<!-- -->
<p>quiCkLI makes these decisions explicit: applications own dispatch, commands describe
operations, and arguments and options describe inputs. That simplicity is useful, but it
also means the caller still owns process output and exit codes.</p>
<div class="theme-admonition theme-admonition-note admonition_Qx6W alert alert--secondary"><div class="admonitionHeading_S1FI"><span class="admonitionIcon_VL2H"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>hinweis</div><div class="admonitionContent_PclH"><p>Treat the boundary between the framework and the executable wrapper as a design decision,
not an implementation detail.</p></div></div>]]></content:encoded>
            <category>Getting Started</category>
            <category>quickli</category>
            <category>cli</category>
            <category>design</category>
        </item>
        <item>
            <title><![CDATA[Erste Schritte mit quiCkLI: Dateien lesen und Eingaben validieren]]></title>
            <link>https://spmse.github.io/quickli/de/blog/quickli-tutorial-02-file-tools</link>
            <guid>https://spmse.github.io/quickli/de/blog/quickli-tutorial-02-file-tools</guid>
            <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Lerne, wie du Dateipfade entgegennimmst, sie vor dem Ausführen deines Handlers validierst und globale Optionen verwendest. Wir bauen quickcat, einen minimalen Datei-Viewer.
]]></description>
            <content:encoded><![CDATA[<p>In <a class="" href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-01-hello-world">Teil 1</a> hast du ein Begrüßungstool mit
einem einzigen Argument und einem Schalter gebaut. In diesem Artikel kommen zwei neue
Konzepte dazu: <strong>Validatoren</strong>, die ungültige Eingaben abfangen, bevor dein Handler
ausgeführt wird, und <strong>globale Optionen</strong>, die für jede Anweisung in einer Anwendung
gelten.</p>
<p>Das Beispiel ist <code>quickcat</code>, ein minimaler Datei-Viewer nach dem Vorbild des
Unix-<code>cat</code>-Befehls.</p>
<!-- -->
<aside class="blog-series-navigation" aria-label="Serie"><p><strong>Erste Schritte mit quiCkLI</strong></p><p>Teil 2 von 3</p><ol><li><a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-01-hello-world">1<!-- -->. <!-- -->Deine erste Kommandozeilenanwendung</a></li><li aria-current="page"><a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-02-file-tools">2<!-- -->. <!-- -->Dateien lesen und Eingaben validieren</a></li><li><a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-03-multi-command-cli">3<!-- -->. <!-- -->Multi-Command-Anwendungen</a></li></ol><p><a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-01-hello-world">← <!-- -->Zurück</a> · <a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-03-multi-command-cli">Weiter<!-- --> →</a></p><p><a href="https://spmse.github.io/quickli/de/blog/series">Alle Blog-Serien anzeigen</a></p></aside>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="was-du-bauen-wirst">Was du bauen wirst<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-02-file-tools#was-du-bauen-wirst" class="hash-link" aria-label="Direkter Link zur Was du bauen wirst" title="Direkter Link zur Was du bauen wirst" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Dek1 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QEAE"><pre tabindex="0" class="prism-code language-bash codeBlock_OciL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines__6Ls"><div class="token-line" style="color:#393A34"><span class="token plain">$ python quickcat.py README.md</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ python quickcat.py README.md </span><span class="token parameter variable" style="color:#36acaa">--number</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ python quickcat.py README.md </span><span class="token parameter variable" style="color:#36acaa">-i</span><span class="token plain"> CONTRIBUTING.md </span><span class="token parameter variable" style="color:#36acaa">--verbose</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="neue-konzepte">Neue Konzepte<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-02-file-tools#neue-konzepte" class="hash-link" aria-label="Direkter Link zur Neue Konzepte" title="Direkter Link zur Neue Konzepte" translate="no">​</a></h2>
<table><thead><tr><th>Konzept</th><th>Zweck</th></tr></thead><tbody><tr><td><code>file_path()</code></td><td>Eingebauter Validator, der prüft, ob ein Pfad auf eine echte Datei zeigt</td></tr><tr><td><code>global_options</code></td><td>Optionen auf <code>Application</code>-Ebene, die für jeden Handler gelten</td></tr><tr><td><code>multiple=True</code></td><td>Dieselbe Option mehrfach übergeben und Werte in einer Liste sammeln</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="globale-optionen">Globale Optionen<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-02-file-tools#globale-optionen" class="hash-link" aria-label="Direkter Link zur Globale Optionen" title="Direkter Link zur Globale Optionen" translate="no">​</a></h2>
<div class="language-python codeBlockContainer_Dek1 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QEAE"><pre tabindex="0" class="prism-code language-python codeBlock_OciL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines__6Ls"><div class="token-line" style="color:#393A34"><span class="token plain">app </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Application</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"quickcat"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    description</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Ein winziges cat-ähnliches CLI, gebaut mit quickli."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    global_options</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Option</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"verbose"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> short_name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"v"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> is_flag</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> help_text</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Ausführliche Ausgabe aktivieren."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>Globale Optionen werden auf <code>Application</code>-Ebene definiert. Jeder Handler, der sie
verwenden möchte, muss den entsprechenden Parameter deklarieren.</p>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="der-file_path-validator">Der <code>file_path</code>-Validator<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-02-file-tools#der-file_path-validator" class="hash-link" aria-label="Direkter Link zur der-file_path-validator" title="Direkter Link zur der-file_path-validator" translate="no">​</a></h2>
<div class="language-python codeBlockContainer_Dek1 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QEAE"><pre tabindex="0" class="prism-code language-python codeBlock_OciL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines__6Ls"><div class="token-line" style="color:#393A34"><span class="token plain">Argument</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"path"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> help_text</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Primärer Dateipfad."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> validators</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">file_path</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">```bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ `file_path</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">` ist eine eingebaute Validator</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">Factory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"> Sie gibt ein Callable zurück</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> das</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ quickli nach dem Parsen</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> aber vor dem Aufruf deines Handlers ausführt</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"> Wenn der Pfad</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ nicht existiert oder keine Datei ist</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> wird die Ausführung mit einer klaren Fehlermeldung</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ abgebrochen</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token comment" style="color:#999988;font-style:italic">## Wiederholbare Optionen</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ ```python</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ Option</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$     </span><span class="token string" style="color:#e3116c">"include"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$     short_name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"i"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$     multiple</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$     validators</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">file_path</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$     help_text</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Zusätzliche Dateipfade, die nach der primären Datei ausgegeben werden."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><br></div></code></pre></div></div>
<p><code>multiple=True</code> ermöglicht es, die Option mehrfach zu übergeben. Der Handler empfängt
<code>include</code> als <code>list[Path] | None</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="das-vollständige-beispiel">Das vollständige Beispiel<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-02-file-tools#das-vollst%C3%A4ndige-beispiel" class="hash-link" aria-label="Direkter Link zur Das vollständige Beispiel" title="Direkter Link zur Das vollständige Beispiel" translate="no">​</a></h2>
<div class="language-python codeBlockContainer_Dek1 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QEAE"><pre tabindex="0" class="prism-code language-python codeBlock_OciL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines__6Ls"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> __future__ </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> annotations</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> pathlib </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Path</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> quickli </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> Application</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Argument</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Option</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> file_path</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">app </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Application</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"quickcat"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    description</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Ein winziges cat-ähnliches CLI, gebaut mit quickli."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    global_options</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Option</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"verbose"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> short_name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"v"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> is_flag</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> help_text</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Ausführliche Ausgabe aktivieren."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token decorator annotation punctuation" style="color:#393A34">@app</span><span class="token decorator annotation punctuation" style="color:#393A34">.</span><span class="token decorator annotation punctuation" style="color:#393A34">entrypoint</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    help_text</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Eine oder mehrere Textdateien auf stdout ausgeben."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    arguments</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Argument</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"path"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> help_text</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Primärer Dateipfad."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> validators</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">file_path</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    options</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Option</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"encoding"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> short_name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"e"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> default</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"utf-8"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> help_text</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Zeichenkodierung."</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Option</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"number"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> short_name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"n"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> help_text</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Zeilennummern ausgeben."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> is_flag</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Option</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">"include"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            short_name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"i"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            multiple</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            validators</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">file_path</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            help_text</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Zusätzliche Dateipfade nach der primären Datei."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">show</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Path</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    encoding</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"utf-8"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    number</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">bool</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">False</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    include</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">list</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Path</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    verbose</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">bool</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">False</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    input_paths </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">path</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">include </span><span class="token keyword" style="color:#00009f">or</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    rendered_chunks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">list</span><span class="token punctuation" style="color:#393A34">[</span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> input_path </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> input_paths</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        text </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> input_path</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">read_text</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">encoding</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">encoding</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        lines </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> text</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">splitlines</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> number</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            lines </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string-interpolation string" style="color:#e3116c">f"</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">index</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">:</span><span class="token string-interpolation interpolation format-spec">&gt;4</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">  </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">line</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> index</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> line </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token builtin">enumerate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lines</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> start</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> verbose</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            rendered_chunks</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">append</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"==&gt; </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">input_path</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c"> &lt;=="</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        rendered_chunks</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">append</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"\n"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">join</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">lines</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"\n"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">join</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">chunk </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> chunk </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> rendered_chunks </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> chunk</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> __name__ </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"__main__"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">app</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="was-du-gelernt-hast">Was du gelernt hast<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-02-file-tools#was-du-gelernt-hast" class="hash-link" aria-label="Direkter Link zur Was du gelernt hast" title="Direkter Link zur Was du gelernt hast" translate="no">​</a></h2>
<ul>
<li class=""><code>global_options</code> auf <code>Application</code> deklarieren Optionen, die für jeden Handler verfügbar sind.</li>
<li class=""><code>file_path()</code> validiert, dass ein Wert auf eine vorhandene, lesbare Datei zeigt.</li>
<li class=""><code>multiple=True</code> sammelt wiederholte Optionswerte in einer Liste.</li>
<li class="">Validatoren laufen vor dem Handler und halten dessen Körper sauber.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="weiter-in-dieser-reihe">Weiter in dieser Reihe<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-02-file-tools#weiter-in-dieser-reihe" class="hash-link" aria-label="Direkter Link zur Weiter in dieser Reihe" title="Direkter Link zur Weiter in dieser Reihe" translate="no">​</a></h2>
<p>Der abschließende Artikel baut eine kubectl-ähnliche Multi-Command-Anwendung mit
<code>@app.command</code>, eigenen Validator-Factories und <code>CommandExecutionError</code>.</p>
<p>📖 <a class="" href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-03-multi-command-cli">Teil 3: Multi-Command-Anwendungen →</a></p>]]></content:encoded>
            <category>tutorial</category>
            <category>quickli</category>
            <category>python</category>
            <category>cli</category>
            <category>validators</category>
            <category>file-path</category>
        </item>
        <item>
            <title><![CDATA[quiCkLI entwickeln: Für wen ist dieses Framework?]]></title>
            <link>https://spmse.github.io/quickli/de/blog/building-quickli-02-target-audience</link>
            <guid>https://spmse.github.io/quickli/de/blog/building-quickli-02-target-audience</guid>
            <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[quiCkLI ist kein Ersatz für produktive CLI-Frameworks. Dieser Beitrag definiert die Zielgruppe  -  Entwickler, die verstehen wollen, wie CLI-Tools gebaut werden  -  und erklärt, was dieser Fokus für das Design bedeutet.
]]></description>
            <content:encoded><![CDATA[<p>Jede Designentscheidung in <code>quiCkLI</code> wurde mit einer bestimmten Art von Entwickler im
Sinn getroffen. In diesem Beitrag möchte ich explizit darüber sprechen, wer das ist,
denn es erklärt Entscheidungen, die sonst willkürlich wirken könnten.</p>
<!-- -->
<aside class="blog-series-navigation" aria-label="Serie"><p><strong>quiCkLI entwickeln</strong></p><p>Teil 2 von 2</p><ol><li><a href="https://spmse.github.io/quickli/de/blog/building-quickli-01-motivation">1<!-- -->. <!-- -->Warum ich ein minimales CLI-Framework gestartet habe</a></li><li aria-current="page"><a href="https://spmse.github.io/quickli/de/blog/building-quickli-02-target-audience">2<!-- -->. <!-- -->Für wen ist dieses Framework gedacht?</a></li></ol><p><a href="https://spmse.github.io/quickli/de/blog/building-quickli-01-motivation">← <!-- -->Zurück</a></p><p><a href="https://spmse.github.io/quickli/de/blog/series">Alle Blog-Serien anzeigen</a></p></aside>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="die-primäre-zielgruppe">Die primäre Zielgruppe<a href="https://spmse.github.io/quickli/de/blog/building-quickli-02-target-audience#die-prim%C3%A4re-zielgruppe" class="hash-link" aria-label="Direkter Link zur Die primäre Zielgruppe" title="Direkter Link zur Die primäre Zielgruppe" translate="no">​</a></h2>
<p><code>quiCkLI</code> ist für Entwickler, die verstehen wollen, wie eine Kommandozeilenanwendung
zusammengesetzt wird  -  nicht nur, wie man eine verwendet.</p>
<p>Diese Gruppe umfasst:</p>
<ul>
<li class=""><strong>Studierende und Berufsanfänger</strong>, die ihre ersten Kommandozeilentools bauen. Sie
brauchen ein Framework, bei dem die Mechanik sichtbar ist, nicht hinter einer
polierten Abstraktion verborgen.</li>
<li class=""><strong>Entwickler, die aus anderen Sprachen kommen</strong> und den Python-Ansatz zum CLI-Design
verstehen wollen, ohne den Quellcode eines großen Frameworks lesen zu müssen.</li>
<li class=""><strong>Erfahrene Entwickler</strong>, die eine kleine, lesbare Referenzimplementierung als
Lehrmittel oder Ausgangspunkt für eigene Experimente nutzen möchten.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="für-wen-quickli-nicht-geeignet-ist">Für wen quiCkLI nicht geeignet ist<a href="https://spmse.github.io/quickli/de/blog/building-quickli-02-target-audience#f%C3%BCr-wen-quickli-nicht-geeignet-ist" class="hash-link" aria-label="Direkter Link zur Für wen quiCkLI nicht geeignet ist" title="Direkter Link zur Für wen quiCkLI nicht geeignet ist" translate="no">​</a></h2>
<p>Wenn du ein produktives CLI-Tool baust und Shell-Vervollständigung, verschachtelte
Unterbefehle, Konfigurationsdateien und einen umfangreichen Hilfe-Renderer benötigst,
verwende <code>click</code> oder <code>typer</code>. Sie sind ausgezeichnete Tools, die genau für diesen Zweck
entwickelt wurden.</p>
<p><code>quiCkLI</code> trifft bewusste Kompromisse, die in einem produktiven Framework inakzeptabel
wären:</p>
<ul>
<li class="">Es liest <code>sys.argv[1:]</code> standardmäßig, aber lässt sich mit <code>auto_sys_argv=False</code> deaktivieren.</li>
<li class="">Es druckt keine Ausgabe und wählt keine Exit-Codes.</li>
<li class="">Es bietet keine Shell-Vervollständigung.</li>
<li class="">Die Plugin-Erkennung ist manuell.</li>
</ul>
<p>Das sind keine Versehen. Es sind bewusste Entscheidungen, die die Teile sichtbar halten.</p>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="was-die-zielgruppe-braucht">Was die Zielgruppe braucht<a href="https://spmse.github.io/quickli/de/blog/building-quickli-02-target-audience#was-die-zielgruppe-braucht" class="hash-link" aria-label="Direkter Link zur Was die Zielgruppe braucht" title="Direkter Link zur Was die Zielgruppe braucht" translate="no">​</a></h2>
<p>Ein Lernender braucht:</p>
<ol>
<li class=""><strong>Eine kleine Oberfläche.</strong> Wenn das Framework zwanzig Klassen hat, erfordert das
Verständnis, alle zwanzig zu kennen. <code>quickli</code> hat fünf Kernkonzepte.</li>
<li class=""><strong>Explizite Grenzen.</strong> Wo endet das Framework und wo beginnt die Anwendung? In
<code>quickli</code> ist diese Grenze <code>Application.run()</code>. Die Verantwortung für Exit-Codes und
Ausgabe bleibt bei der Anwendung.</li>
<li class=""><strong>Ausführbare Beispiele.</strong> Theorie reicht nicht. Die Referenzbeispiele im Repository
sind echte, ausführbare Tools.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="was-das-für-das-projekt-bedeutet">Was das für das Projekt bedeutet<a href="https://spmse.github.io/quickli/de/blog/building-quickli-02-target-audience#was-das-f%C3%BCr-das-projekt-bedeutet" class="hash-link" aria-label="Direkter Link zur Was das für das Projekt bedeutet" title="Direkter Link zur Was das für das Projekt bedeutet" translate="no">​</a></h2>
<p><code>quiCkLI</code> für Lernende nützlich zu halten bedeutet, dem natürlichen Impuls zu
widerstehen, Funktionen hinzuzufügen. Jede Funktion vergrößert die Oberfläche. Jede
Abstraktion verbirgt etwas.</p>
<p>Der Qualitätsmaßstab des Projekts ist nicht nur <em>funktioniert es</em>  -  sondern <em>ist es noch
einfach zu verstehen</em>.</p>]]></content:encoded>
            <category>Building quiCkLI</category>
            <category>meta</category>
            <category>target-audience</category>
            <category>design</category>
            <category>quickli</category>
        </item>
        <item>
            <title><![CDATA[Erste Schritte mit quiCkLI: Multi-Command-Anwendungen]]></title>
            <link>https://spmse.github.io/quickli/de/blog/quickli-tutorial-03-multi-command-cli</link>
            <guid>https://spmse.github.io/quickli/de/blog/quickli-tutorial-03-multi-command-cli</guid>
            <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Baue ein kubectl-ähnliches CLI mit mehreren benannten Befehlen, gemeinsamen globalen Optionen, eigenen Validatoren und expliziter Fehlerbehandlung. Der abschließende Teil der Einstiegsreihe zeigt, wie alle quickli-Bausteine zusammenpassen.
]]></description>
            <content:encoded><![CDATA[<p>In den ersten beiden Teilen dieser Reihe hast du ein Begrüßungstool und einen
Datei-Viewer gebaut. In diesem abschließenden Artikel kombinierst du alles Gelernte
und baust <code>pyk5l</code>, eine kubectl-ähnliche Multi-Command-Anwendung.</p>
<!-- -->
<aside class="blog-series-navigation" aria-label="Serie"><p><strong>Erste Schritte mit quiCkLI</strong></p><p>Teil 3 von 3</p><ol><li><a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-01-hello-world">1<!-- -->. <!-- -->Deine erste Kommandozeilenanwendung</a></li><li><a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-02-file-tools">2<!-- -->. <!-- -->Dateien lesen und Eingaben validieren</a></li><li aria-current="page"><a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-03-multi-command-cli">3<!-- -->. <!-- -->Multi-Command-Anwendungen</a></li></ol><p><a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-02-file-tools">← <!-- -->Zurück</a></p><p><a href="https://spmse.github.io/quickli/de/blog/series">Alle Blog-Serien anzeigen</a></p></aside>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="was-du-bauen-wirst">Was du bauen wirst<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-03-multi-command-cli#was-du-bauen-wirst" class="hash-link" aria-label="Direkter Link zur Was du bauen wirst" title="Direkter Link zur Was du bauen wirst" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Dek1 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QEAE"><pre tabindex="0" class="prism-code language-bash codeBlock_OciL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines__6Ls"><div class="token-line" style="color:#393A34"><span class="token plain">$ python app.py get pods</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ python app.py get pods </span><span class="token parameter variable" style="color:#36acaa">--output</span><span class="token plain"> json </span><span class="token parameter variable" style="color:#36acaa">--namespace</span><span class="token plain"> ops</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ python app.py describe pod api-7d4f5f6b89-l2xq9</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ python app.py logs api-7d4f5f6b89-l2xq9 </span><span class="token parameter variable" style="color:#36acaa">--tail</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">--timestamps</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ python app.py apply manifests/web-pod.yaml --dry-run</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="appcommand-vs-appentrypoint"><code>@app.command</code> vs. <code>@app.entrypoint</code><a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-03-multi-command-cli#appcommand-vs-appentrypoint" class="hash-link" aria-label="Direkter Link zur appcommand-vs-appentrypoint" title="Direkter Link zur appcommand-vs-appentrypoint" translate="no">​</a></h2>
<p>Bisher hast du <code>@app.entrypoint</code> verwendet, das einen einzelnen Handler für die gesamte
Anwendung registriert. Für mehrere Befehle verwendest du stattdessen <code>@app.command</code>:</p>
<div class="language-python codeBlockContainer_Dek1 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QEAE"><pre tabindex="0" class="prism-code language-python codeBlock_OciL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines__6Ls"><div class="token-line" style="color:#393A34"><span class="token decorator annotation punctuation" style="color:#393A34">@app</span><span class="token decorator annotation punctuation" style="color:#393A34">.</span><span class="token decorator annotation punctuation" style="color:#393A34">command</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"get"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    help_text</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"Ressourcen im ausgewählten Namespace auflisten."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    arguments</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    options</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">resource</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><br></div></code></pre></div></div>
<p>Der <code>name</code>-Parameter wird zum ersten Token in der Kommandozeile. Wenn <code>name</code> weggelassen
wird, wird der Funktionsname verwendet. Du kannst so viele Befehle registrieren, wie du
benötigst.</p>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="eigene-validator-factories">Eigene Validator-Factories<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-03-multi-command-cli#eigene-validator-factories" class="hash-link" aria-label="Direkter Link zur Eigene Validator-Factories" title="Direkter Link zur Eigene Validator-Factories" translate="no">​</a></h2>
<p>quickli enthält eingebaute Validatoren (<code>file_path</code>, <code>positive_number</code> und weitere),
aber du kannst eigene nach demselben Muster schreiben:</p>
<div class="language-python codeBlockContainer_Dek1 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QEAE"><pre tabindex="0" class="prism-code language-python codeBlock_OciL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines__6Ls"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">one_of</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">choices</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    allowed </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">tuple</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">choices</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    description </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"eines von: "</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">", "</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">join</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">allowed</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">validate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">object</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token builtin">object</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> value </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> allowed</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">raise</span><span class="token plain"> ValueError</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"Erwartet eines von: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation string" style="color:#e3116c">', '</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">join</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">(</span><span class="token string-interpolation interpolation">allowed</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">)</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> value</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    validate</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">description </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> description</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> validate</span><br></div></code></pre></div></div>
<p>Eine Validator-Factory gibt ein Callable zurück, das:</p>
<ol>
<li class="">Den konvertierten Wert empfängt.</li>
<li class="">Den Wert unverändert zurückgibt, wenn er gültig ist.</li>
<li class=""><code>ValueError</code> mit einer klaren Nachricht auslöst, wenn nicht.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="commandexecutionerror"><code>CommandExecutionError</code><a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-03-multi-command-cli#commandexecutionerror" class="hash-link" aria-label="Direkter Link zur commandexecutionerror" title="Direkter Link zur commandexecutionerror" translate="no">​</a></h2>
<p><code>CommandExecutionError</code> ist für erwartete, domänenspezifische Fehler:</p>
<div class="language-python codeBlockContainer_Dek1 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QEAE"><pre tabindex="0" class="prism-code language-python codeBlock_OciL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines__6Ls"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">_find_pod</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> Pod</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> pod </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> PODS</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">namespace </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> namespace </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> pod</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">name </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> pod</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">raise</span><span class="token plain"> CommandExecutionError</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string-interpolation string" style="color:#e3116c">f"Pod '</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">name</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">' wurde im Namespace '</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">namespace</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">' nicht gefunden."</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>Diese Ausnahme propagiert unverändert aus <code>Application.run()</code>. Deine Anwendung kann sie
abfangen und in einen Exit-Code umwandeln.</p>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="globale-optionen-die-alle-befehle-teilen">Globale Optionen, die alle Befehle teilen<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-03-multi-command-cli#globale-optionen-die-alle-befehle-teilen" class="hash-link" aria-label="Direkter Link zur Globale Optionen, die alle Befehle teilen" title="Direkter Link zur Globale Optionen, die alle Befehle teilen" translate="no">​</a></h2>
<p>Deklariere Optionen einmalig auf <code>Application</code>. Jeder Handler, der sie benötigt,
deklariert denselben Parameternamen:</p>
<div class="language-python codeBlockContainer_Dek1 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QEAE"><pre tabindex="0" class="prism-code language-python codeBlock_OciL thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines__6Ls"><div class="token-line" style="color:#393A34"><span class="token plain">app </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Application</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"pyk5l"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    global_options</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Option</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"namespace"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> short_name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"n"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> default</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"default"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Option</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"output"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> short_name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"o"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> default</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"table"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">               validators</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">one_of</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"table"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"json"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"wide"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        Option</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"verbose"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> short_name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"v"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> is_flag</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="was-du-gelernt-hast">Was du gelernt hast<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-03-multi-command-cli#was-du-gelernt-hast" class="hash-link" aria-label="Direkter Link zur Was du gelernt hast" title="Direkter Link zur Was du gelernt hast" translate="no">​</a></h2>
<ul>
<li class=""><code>@app.command</code> registriert benannte Befehle in einer Multi-Command-Anwendung.</li>
<li class="">Eigene Validator-Factories folgen demselben Muster wie eingebaute Validatoren.</li>
<li class=""><code>CommandExecutionError</code> signalisiert erwartete domänenspezifische Fehler.</li>
<li class="">Auf <code>Application</code> deklarierte globale Optionen sind für jeden Handler verfügbar.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_s_6P" id="die-vollständigen-quickli-bausteine">Die vollständigen quiCkLI-Bausteine<a href="https://spmse.github.io/quickli/de/blog/quickli-tutorial-03-multi-command-cli#die-vollst%C3%A4ndigen-quickli-bausteine" class="hash-link" aria-label="Direkter Link zur Die vollständigen quiCkLI-Bausteine" title="Direkter Link zur Die vollständigen quiCkLI-Bausteine" translate="no">​</a></h2>
<table><thead><tr><th>Baustein</th><th>Zweck</th></tr></thead><tbody><tr><td><code>Application</code></td><td>Wurzel-Container; verwaltet Dispatch und Registrierung</td></tr><tr><td><code>Command</code></td><td>Benannte Operation (registriert über <code>@app.command</code>)</td></tr><tr><td><code>Argument</code></td><td>Positionaler, geordneter Input</td></tr><tr><td><code>Option</code></td><td>Benannter Input; Schalter, wiederholbare Werte, Konverter, Validatoren</td></tr><tr><td><code>Plugin</code></td><td>Wiederverwendbares Befehls-Bundle, das in eine Anwendung geladen wird</td></tr></tbody></table>
<p>Lies die <a class="" href="https://spmse.github.io/quickli/de/docs/concepts/quickli-concepts">Konzept-Referenz</a> für die vollständige
API-Dokumentation oder erkunde die <a class="" href="https://spmse.github.io/quickli/de/docs/guides">Implementierungsleitfäden</a> für
schrittweise Anleitungen.</p>]]></content:encoded>
            <category>tutorial</category>
            <category>quickli</category>
            <category>python</category>
            <category>cli</category>
            <category>multi-command</category>
            <category>commands</category>
        </item>
        <item>
            <title><![CDATA[Why CLIs Still Matter for Operations]]></title>
            <link>https://spmse.github.io/quickli/de/blog/2026/08/25/clis-for-operations</link>
            <guid>https://spmse.github.io/quickli/de/blog/2026/08/25/clis-for-operations</guid>
            <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Why system administration, automation, DevOps, and SRE continue to rely on command-line tools.]]></description>
            <content:encoded><![CDATA[<p>Operations work values repeatability, composability, low overhead, and precise control.
Those properties are natural strengths of command-line tools, especially when a task must
run from a shell, a scheduled job, a container, or a recovery environment.</p>
<!-- -->
<p>CLIs also create durable interfaces between people, scripts, services, and infrastructure.
Their limitations are real, but a focused command with predictable text and exit behavior
can remain useful for years.</p>]]></content:encoded>
            <category>General</category>
            <category>quickli</category>
            <category>cli</category>
            <category>devops</category>
            <category>sre</category>
            <category>automation</category>
        </item>
        <item>
            <title><![CDATA[Why CLIs Still Matter for AI Agents]]></title>
            <link>https://spmse.github.io/quickli/de/blog/2026/08/27/clis-for-ai-agents</link>
            <guid>https://spmse.github.io/quickli/de/blog/2026/08/27/clis-for-ai-agents</guid>
            <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How explicit command-line interfaces can give AI agents useful, inspectable tools.]]></description>
            <content:encoded><![CDATA[<p>AI agents need tools with clear inputs, observable outputs, and bounded side effects. A CLI
can provide that contract without hiding the operation behind an opaque integration layer.</p>
<!-- -->
<p>Good agent-facing CLIs still need careful schemas, validation, idempotence, useful errors,
and permissions. The command line is not automatically safe, but it is a practical surface
for making tool behavior visible to both people and agents.</p>]]></content:encoded>
            <category>General</category>
            <category>quickli</category>
            <category>cli</category>
            <category>ai</category>
            <category>agents</category>
        </item>
    </channel>
</rss>