Mininterface: Ze skriptu program

Každý programátor řeší dokola tytéž věci. Potká překážku. Vymačká z klávesnice deset dvacet řádků, které ji překonávají; hotovo. Ale proč si nezahrát na trochu obecnější řešení, stačí přidat pár proměnných… Jak ale zajistit, že budu skript umět ovládat ještě za týden? Nebo jak usnadnit jeho spuštění, aby ho mohl spouštět, světe drž se, i někdo další? Potřebujete rozhraní, kterým se váš kód ovládá. Pro různé souborové pahýly, které se povalují na discích, mají nahoře #! a vlevo od sebe +x, platí nepsaný úzus, že úplně nahoře se dokumentují proměnné, jež je třeba změnit. Lepší skripty lze spustit s parametrem --help, který popisuje detaily.
A pak se stane co? Skript roste, vyvíjí se, měnit dokumentaci je náročné. “Spouštění z příkazové řádky by mělo umět to i to,” říkáte si, “ale je fuška všechny ty možnosti přidávat.”

Python mnoho věcí řeší sám – srovnejme například vestavěnou funkci sum proti javascriptu (JS), jazyku, který se dusí svými vlastními pravidly, jazyku, kde součet hodnot se vždy znovu nestoudně programuje pomocí reduce. Nepřekvapí vás koncept, že v Pythonu je prázdný seznam vyhodnocen jako nepravda [] == False, zatímco vždy znovu šokuje, že v JS je výraz pravdivý jako kulatá země, protože se jedná o objekt. O Pythonu se zkrátka říká, že má batteries included, vše důležité v sobě. Neplatí to ale o rozhraních pro uživatele. Nedávno jsem dělal analýzu desítek knihoven, které taková rozhraní programům dodávají.

Zkoumal jsem i vestavěnou argparse či hegemona click a originální fire. Ve srovnání s nimi mi zvítězila neznámá knihovna tyro. Dotahuje vynikající koncept, kdy programátor pro všechna nastavení používá jediný objekt, z kterého se zároveň čte i při běhu programu. A nenutí vás k žádným zhůvěřilostem, kde může, používá standardní zápisy. Pokud přidáváte novou možnost, dáte ji pouze do tohoto objektu a v příkazové řádce (CLI) se objeví sám.

Kam tyro už nechtělo jít

Jenže tyro se zajímá pouze o příkazovou řádku a každý program prahne po dalších soustech. První z nich jsou konfigurační soubory. Hodí se, když kromě výchozího nastavení a změny přes CLI může uživatel uchovávat stav i uceleně v souboru. A druhou věcí jsou dialogy. Prostě se občas potřebujete uživatele na něco zeptat, tak proč stále programovat kolo. Ve webovém prohlížeči (zase JS) máte alespoň alert, confirm a prompt, pokud chcete text zobrazit, získat boolean nebo řetězec. Už to mi odedávna připadá na základní výbavu chudičké. Vrhá vás v náruč HTML formulářům, kde se tak vyšťavíte, že vám mimo toho, aby to hezky vypadalo, nezbude elán, aby to dobře fungovalo. (Vždycky si postesknu, když nefunguje standardní Escape na zavření dialogu.) A Python? Ten nabízí dokonce pouhý input, a to je příliš low-level funkce, s kterou se nemá cenu pouštět do nějakých složitejších vyprávěnek. Stále dokola jsem narážel na to, že potřebuji od uživatele zjistit boolean (jestli se má něco stát, nebo ne), hodnotu nebo vybrat hodnotu z nabídky… Proč se nad tím vždycky zamýšlet a zdržovat?

Asi se budu stydět, až mi do prvního komentáře napíšete, že taková věc léta existuje a že jsem blázen ji nepoužívaje, ale já jsem řešení nenašel, a tak si ho musel naprogramovat. Léta frustrace jsem hodil do kotlíku očekávaného chování a přetavil v úžas, jak snadno se z pár řádků kódu stane ucelený program. Představuji vám knihovnu Mininterface, bránu, která jediným řádkem umožní vašim črtům přístup ke CLI a konfiguračním souborům. A nadto – specifikovat dotazy v normálním grafickém okně (GUI). A na počítačích, které nemají monitor (například přes SSH), se rozhraní automaticky poníží na textové, ale ne ledajaké, plnokrevné, klikací. Zajistí, že nebudete potřebovat své proměnné konfigurovat 10× – v programu, v dokumentaci, pro CLI a kdoví kde ještě. Napište je jednou do standardní dataclass, napište dokumentaci hezky k nim, jako byste psali pro sebe, a Mininterface se o všechno postará.

Kdesi jsem slyšel anekdotu, že možnosti známého operačního systému nejdou nastavovat graficky, protože velká část chyb souvisela s laděním GUI jako takového. S Mininterface tohle končí, GUI za vás odladím já. Podle poučky, že program má dělat málo věcí a má je dělat dobře, se omezuju na pár funkcionalit. Ale pro většinu programů stačí. Od května jej nasazuji, kde můžu, a zatím všude jásám, ubyla mi obrovská spousta práce, a uživatele nenutím chodit do terminálu, dostali grafické okno.

Mininterface pojí na jedné straně tyro pro CLI, konfigurační soubor přes YAML, okna dělá přes široce rozšířený tkinter a textové rozhraní přes kouzelný framework textual.

Co nesmí chybět? Má se metoda dialogu jmenovat is_yes, nebo jenom yes? Je lepší říkat choice, nebo select? Validation, nebo check? Vidíte někde chybu v návrhu? Napište mi, nebo mi rovnou pomozte s vývojem! Když zlepšíte jednu věc, zlepší se nám ve všech programech současně.

Autor:

Zanechte komentář

Všechny údaje jsou povinné. E-mail nebude zobrazen.

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..