V bývalé práci jsme měly ukázkové šablony na řešení daného problému... Většinou očekávaly že člověk nastaví jen několik promennyxh, které byly na začátku souboru nadefinované takto:
Iteration: int = "TODO"
A dole v kódu ještě byla chytrá funkce která projela globální dict a zkontrolovala zda někde nrzostalo nějaké "TODO" jako hodnota.
Ale lintery tohle nenáviděly, protoze "TODO" není int.
Předpokládám že bysme mohli psát
iteration: int = ...
Ale lintery stejně budou řvát, co?
áno, lintery sa sťažujú. Ale toto mi zobralo:
iteration: int | ellipsis = ...
13. 5. 2026, 08:41 editováno autorem komentáře
zoberie aj toto:
from typing import Literal iteration: int | Literal["TODO"] = "TODO"
alebo tiež:
class _TodoType:
pass
TODO = _TodoType()
iteration: int | _TodoType = TODO
Lintery většinou mají důvod si stěžovat. Proč jste si místo šablon třeba neudělali něco jako knihovnu?
Protoze ty sablony jsou v cca 50% jen startovni kod, aby v nem lidi nenasekali zakladni chyby a ne vzdycky staci zavolat "moje_magicka_funkce_z_knihovny(...)". Nedelali jsme SW ale praci nad daty, ktera vzdycky dorazi trosku jina.
A globální dict je ta věc, kterou lidem doporučujete používat? Tam je podle mě dost drsný code smell a lintery ho řeší. Neber to jako kritiku, jen pohled, který to může posunout nějakým potenciálně lepším směrem.
tak vetsina z toho jsou ve vysledku jen jednoucelove skripty a ten check je jenom sanity check. Jen lidi zachranit aspon do jiste miry pred castymi omyly a divnymi problemy ze nekam omylem cpou "TODO" misto treba int :)
Nemel jsem na to silny nazor a ted uz si ho delat nebudu. :)
Nejvic mne stvaly ty lintery, i kdyz i sablon je to take vice mene jedno, dulezite je, aby lintery nebyly nastvane az kdyz je sablona "aplikovana".
Nejsem si jisty, jesli sem za poslednich par let videl zmatenejsi prvek programovaciho jazyka. Literal ktery potrebuje clanek na vysvetleni, navic se da pouzit nekolika prakticky nesouvisejicimi zpusoby je temer fascinujici. A jeste ho knihovna muze "zneuzit" "jak chce"
Mozna kdybych delal template pro kontrolu kritickeho softu, tak bych tam tu `... ` zakazal...
Dokonce i "vsevedouci AI" se toho lekne "python ..." -> "It looks like your query was cut off." ;)
Moje teorie je, že Python byl vymyšlen jako odstrašující příklad, jak by se programovací jazyk neměl designovat. Bohužel to lidi nepochopili :-( Tohle mě v tom jen utvrzuje...
Jako cloveku z venci se mi to velmi subjektivne jevi tak ze Python vymysleli učitele matematiky a ne inženýři ( ve smyslu prace, ne titulu).
A aby měli cim argumentovat vymysleli si PEP jako dogmata ktera se ucite v seminari ale vlastně vam neodpovi na otázku proč.
Uspech pythonu je neco com e neprestava fascinovat.
* je jednoduchy na nauceni
* neco se napise a ono to neco dela (zadna kompilace, zadny typy..)
* vyborne knihovny
Ale
* neni opravdu nijak rychly
* velmi dlouho chybeli kontrolni mechanismy (typy, kompilace...)
** a to jak pozdeji pribili je hodne nasilene vnuceni
A prave ty vyborne knihovny, kdyz se do nich clovek koukne, nejsou zadna trivka. Me to vzdycky prislo, ze se v jakemsi okamziku vsichni spickovy programatori zjistili, ze je tu jakysi novy jazyk. Tak se koukli, co v nem jeste neni naprogramovani, a udelali si knihovicku na nauceni se. Dobre navrzenou, optimali zovanou, udrzovatelnou. A vratili se delat cernou magii, ale knihovna je tu dodnes.
Jelikoz se v tom tak rychle psalo, tak se v tom hodne prototypovalo, ale pak nekdo zjistil ze prepisovat ten prototyp je vlastne plytvani casem, a doamci prace nejakeho vyvojare se preklopila do produkce... A ono to fungovalo.
Python a AI spojuje vse vyse uvedene. Prototyp ktery uz nikdo nemel silu (pochopitelne) preklopit, napsany puvodne vedci, a dodavaji tool co z jednoho promptu udela vse.
Odpoved je ze zadny. Kazdy ma sva pro a proti a kazdy se hodi na neco jineho.
Python, bohuzel, stejne jako javascript, se da zneuzit na kde co....
V okamziku kdy se vybira jazyk pro problem, se casto vybere jazyk ve kterym to team aspon trochu umi. Pokud je ten jazyk absolutne nevhodny.. tka prece python videli sici aspon na skole (a hodi se prece na secko)
Me osobne na nem vadi mizerna zpetna kompatibilita, hybejici typy v zakladu, a mit na secko knihovnu (napr to zmiene PyO3). Osobne davam prednost kompilovanym, nebot ta kompilace odhali dost. Opet, v pythonu to "jaksi je", ale zase, neni to v zakaldu. Proste takovy jakysi na koleni :)
Jeste na skole sem si delal legracni interpretovany jazyk, ktery mel "oop" ale byl proste jen soustavou map. Mim cilem bylo mit tu zakaldni mapu na ktere to stoji co nejuzasneji implementovanou. No a pak nekdo objevil python...
Jo, s tím se většinově dá souhlasit - Python slíbil dost věcí a některé i dodal, ale jeho úspěch přičítám tomu, že ostatní jazyky byly ve srovnání s ním často na pytel. Python je jazyk zaměřený na lidi a interakci s nimi. Ale vždycky potřeboval nějakého silnějšího, ale pomalejšího bráchu, který mu kryl záda. Dříve většinou C, teď často Rust.
Typový systém v Pythonu (anotace a tooling okolo) podle mě není vůbec špatný, pořád se ale vyvíjí. Přišel pozdě? Asi jo, každopádně denně děkuju vývojářům, že se konečně rozhoupali a udělali skok do verze 3. Teď už je to za ně skoro bez vady (zvlášť ve spojení s PyO3).
Tak on to zpočátku byl jazyk, kterej umožňoval přepisovat skripty z awk, BASHe, Perlu do něčeho příčetnějšího. A navíc je to takovej typickej Unixovej přístup - jazyk dost dobře integrovaný do ekosystému okolo jazyka C.
Takže pro Python může vznikat spousta knihoven postavená na céčku nebo klidně i na Fortranu (příkladem jsou části NumPy). A přes céčko jde snadno využívat i GPU (tedy snadno pro člověka, který si jen "pipne" knihovnu typu PyTorch nebo něco podobného).
Některé jiné jazyky šly jinou cestou, například vlastní VM do značné míry odizolované od systému, takže pro ně mnoho nativních rozhraní nevzniklo.
Aby to bylo správně pochopeno: oba přístupy mají svoje pro a proti. Python si prostě našel svou niku a tam přežil do doby konsolidace nástrojů pro statistiku (tady asi už vyhrál a odsouvá S, R (tady do jisté míry), SAS ale i Mathematicu). A druhý nakopnutí nahoru dalo AI a ML (zpočátku ML).
on to zpočátku byl jazyk, kterej umožňoval přepisovat skripty z awk, BASHe, Perlu do něčeho příčetnějšího
Nazvat jazyk, kde nejdůležitějším sémantickým prvkem je mezera příčetnější
mi přišlo natolik zábavné, že jsem si naprskal kafe do klávesnice! ;D
Osobně považuji Python za BASIC moderní doby
- z pohledu jednoduchosti (dobře se učí...), rychlosti (nic moc...), všudypřítomnosti (je to mor...) nebo přezíravého názoru na něj od velkých programátorů v seriosních jazycích.
njn, to že je Python příčetnější než BASH a Perl možná něco naznačuje i o těch dvou jazycích, se kterými se Python poměřoval. (mezery se mi taky zpočátku nezdály, což bylo aspoň v mém případě zvláštní, protože můj druhý jazyk mezery taky používal pro odlišení různých prvků jazyka, takže jsem měl být navyknutý).
Perl? Ok... S tim rozdilem ze to co se napsalo v perlu pred sto lety porad jede, ale to co se napsalo v pythonu pred 8 se muselo dvakrat prepsat...
Srovnat python s luou nebo javascriptem, mi prijde pricetnejsi nez s bashem. A uz ubec ne s awk... ( i kdyz srovanni s bashem, kde nekdo furt pouziva awk, uz ano :) )
To jsou presne ty "jazyk na problem". Rad rikam, ze pokud nekoho napadne ze potrebuje bash debugger, tak odpoved je ze zvolil spatny jazyk. Pak je ok to prepsat do pythnu... a pustit z bashe :). Videl sem i lidi co to takle udelali, ale pouzli groovy. Svete div se, kouslo je to. A tak pouzili primo javu a deployvali na to jary.. a ono to jelo nejlip ze vseho (ne nebyli sme to mi !-) )
Muzes rozvest tu myslenku ze mel python nahradit bash? Uz jsem to parkrat slysel ale argumenty mi nikdy nedavali moc smysl. Bash spousti a ridi procesy. tecka. Presne to python nedela (byt procesy spousti lip nez vetsina jinych jazyku)
Re Perl kompatibilita: protoze je tady Perl 5, tak se tvari jako zpetne kompatibilni, jelikoz se to muze hrat stylem, ze (nekompatibilni) Perl 6 vlastne neexistuje (je to Raku, tedy "mrk mkr" jinej jazyk).
Python 2.7 je uz nepodporovany, takze to takto hrat nemuzeme. Ty 2 prepisy jsou odkud btw?
Jinak PS: ano, v dobe vzniku Python 3000 me ta nekompatibilita strasne stvala, ale zpetne videno je asi dobre, ze do toho rizli a netahaji s sebou stary nesmysly.
Priklad nahrady BASH skriptu, ktery uz prerustaji pres hlavu: https://github.com/lightspeed-core/lightspeed-stack/blob/b9ce55f3940e2bbd4d0d6600dc5cfde2590e39ff/tests/e2e-prow/rhoai/scripts/e2e-ops.sh
A tady, to ti asi prijde hodne vtipny, je dokonce uvnitr schovanej Python: https://github.com/lightspeed-core/lightspeed-stack/blob/b9ce55f3940e2bbd4d0d6600dc5cfde2590e39ff/dev-tools/file-jiras.sh (ani nechces vedet, jak takovy veci vznikaji :-)
Jinak hele to muzu zkusit navrhnout, ze ty skripty nekdo prepise do Javy a budeme tam vsude tahat JVMku. Vlastne bylo by to enterprise reseni...
Dobre, mas pravdu ze v dobe jineho perlu nez "toho ted" jsem nejspis nebyl jeste na svete. Takze ok :) Ze si sebou python netaha zpetnou kompatibilitu je sice hezky, ale to zabiti nebylo uplne elegantni.... Zrovna to se mi v java svete libi vic - odel LTS a @deprecated (for ages). A jeste vic se mi libi v Lue kde nejspis neexistuje...
Oba ty scripty patri do kose a nahradit cimkoliv :D Dekuji za nasdileni! Doted jsem se za nektere sve stydel. Uz nebudu.
Krasna ukazka spatne zvoleneho jazyka. Ale kdo mohl tusit ze tak vyrostou ze:)
Ty tedy tvrdis ze napsat to v jave je enterprise reseni, ale v pythonu?-) Zajimave! Kde pak jen ta hranice je...
Ten kód - musím se někdy stavit u vás ve Vlněně a ukázat, jak se dneska vyvíjí nebo resp. prý má vyvíjet :-)
> Muzes rozvest tu myslenku ze mel python nahradit bash? Uz jsem to parkrat slysel ale argumenty mi nikdy nedavali moc smysl. Bash spousti a ridi procesy. tecka. Presne to python nedela (byt procesy spousti lip nez vetsina jinych jazyku)
IMHO spíš kombinaci bash + awk + grep + sed etc. Pokud půjde striktně o pouštění procesů a netriviální pipe, tak bash bude možná efektivnější - s tím, že zpracování dat bude stejně dělat něco většího. U shell, aby script správně fungoval, bude třeba striktně dodržovat uvozovky (a hodně štěstí s uvozovkama v uvozovkách), -- před parametrama u každého příkazu kvůli konfliktům se soubory začínajícími pomlčkou. Na jakékoliv triviální ověření se volá sed/grep, na větší zpracování awk (třeba str.trim() vs sed). Tyhle všechny kombinace značně komplikují psaní skutečně spolehlivého scriptu, o čitelnosti nemluvě.
Řekl bych, že hlavní úspěch Python v porovnání s Perl, Php, Javascript a dalších je hlavně dostatečně dobré jádro (i když souhlasím, že třeba typování v základu tam chybělo - viz dřívější diskuze) a standardizovaný kód knihoven - dobrá podpora pro třídy a třeba exception handling je klíčová věc jak zajistit spolehlivost s minimálním úsilím - tohle třeba drasticky chybí v Perl, Php a obojí chybělo do velké míry dlouho i v JavaScript.
Perl má spracovanie výnimiek od roku 1994 vo forme
sub risky {
die "invalid data";
}
eval {
risky();
};
if ($@) {
warn "caught: $@";
}
Neskôr pribudla try/catch syntax vo forme knižnice a syntaxtického rozšírenia.
JavaScript má výnimky od roku 1997:
function risky() {
throw new Error("invalid data");
}
try {
risky();
} catch (e) {
console.log("caught:", e.message);
} finally {
console.log("cleanup");
}
PHP má výnimky od roku 2005:
function risky() {
throw new InvalidArgumentException("invalid data");
}
try {
risky();
} catch (InvalidArgumentException $e) {
echo "caught: " . $e->getMessage();
} finally {
echo "cleanup";
}15. 5. 2026, 09:54 editováno autorem komentáře
K výjimkám v JS, Perlu a PHP: Jediné, co trochu připomíná inteligentní řešení, je ten příklad v PHP z roku 2005. Ten Perl je doslova k pláči.
15. 5. 2026, 12:27 editováno autorem komentáře
Perl: Sice my die-eval od nepaměti, ale drtivá většina operací vrací undef, "0 but true" a podobné věci, spousta runtime chyb (třeba přístup mimo pole) maximálně vygeneruje warning. Výsledkem byly všelijaké hacky, lidi začali používat confess, později Error module a každý module má něco jiného.
JavaScript: Podobné problémy, i když je na tom mnohem líp - pořád vyjímky třeba nejsou typované. Vynucené asynchronní programování z toho nicméně udělalo další stupeň chaosu i pro běžné programátory, natož pro ne-programátory.
Php: Podobně jako Perl, výjimky přibyly mnohem později a použití je tak silně nekonzistentní skrz jádro i knihovny.
Python: Vyjímky měl od nepaměti, včetně runtime errors, základní OS operace konzistentně hážou vyjímky a stejně tak všechny ostatní části jádra nebo třetích stran.
Ten rozdíl je vidět. Python byl prostě dostatečně hotový předtím než se rozšířil, na to, aby si lidi už udrželi základní kulturu.
Za jeho úspěch můžou ty hnusky v perlu které musime udrzovat dodnes. Delali jste v tom nekdy dynamicky web?
Python byl menší zlo a jelo to hned. Produktivita vysoká.
Prostě člověk vezme pohodlnější nástroj I kdyz je architektura méně promyslena nebo horší.
Take raději vezmu elektrickou pilu ( nedávejte tomu treba mafl) z ne az tak kvalitním kotoučem než abych to řezal ručně velmi ostrým platkem ze švédské ocele.
15. 5. 2026, 00:31 editováno autorem komentáře
To, že se Tišník dokáže rozepsat o možnostech použití, neznamená, že je potřeba něco vysvětlovat na jednom extra literálu. Snad jsi ten článek četl, ne?
Já když jsem to viděl poprvé, tak mi to taky nešlo pod vousy, ale fakt je, že když se použije vhodně, tak prostě dává smysl a kód vypadá pěkně.
Ahoj Jirko. A jak to píšeš ty v Javě? Do komentářů? A v případě Callable[...] přes generické typy?
Jinak ano, Python má některé věci matoucí. Napadá mě mroží operátor, u kterého sice chápu, proč je dobré ho v jazyku mít, ale prostě do Pythonu IMHO nezapadá. A potom trošku násilně přidané nonlocal (zase, má to smysl, ale ukazuje to na nedostatek původního návrhu jazyka).
PS: to s AI vlastně potěšilo
ano, AI te melo rozesmat. Ja se malem rozbrecel smichy kdyz sem to uvidel.
Ad ` Callable[...]` .. Odpoved je snadna. Tak jak si to udelal, tak tak bych to v jave nedelal. A kdyby mi to nekdo nekam chtel commitnout, tak bych ho s tim vyhodil. Donutil bych ho udelat nejaku interface "calculable" s radnou factory metodou atd... Proste OOP balast^n a ve vysledku by to bylo to stejne, ale silne typovane, pripadne s generiky
Coz jak tu nekdo nadaval ze python napsali matematici.. tak to je presne to co vedci chteji - ono to neco vzdycky udela,a vetsinou dokonce i to co ocekavas. Zatim co me zrovna tahle featurka v pythonu hrozne irituje. ten `callable` , i pres svoji nepochybnou genialitu, je presne ono.
Jj chapu.
Re: Callable: tedy neco na zpusob "tuto metodu chci logovat" nebo "u techto metod chci zmerit dobu trvani" implementovat moc nepujde, jedine pres nejaky AOP ze? Nebo, aby to bylo zajimavejsi, treba RBAC?
Ale ptal jsem se i na dalsi pouziti. Treba u metod, ktere ZATIM nejsou plne implementovany, tam to napises do poznamky predpokladam?
Re: indexovani v Numpy - to asi taky nepujde resit?
Ne, to numpy indexovani elegantne replikovat (v jave.. vlastne nikde) nedokazu. Nevim jestli je to dobre nebo spatne, nebo treba chyba designu O:)
ten druhy pripad = zatim neimplementovano - je beznejsi. Rad bych rekl ze se to lisi uziti od uziti: Anotace, komentar, vyjimka, return null/default atd...
Priznam ze " funkce ještě v budoucnu rozšíří" je takovy zvlastni pripad, ktery si mozna nezaslouzi vlastni klicove slovo.. Na druhou stranu porad plati co jsem napsal puvodne - ze literal ktery se da vyuzit tolika nepribuznymi zpusobu je proste fascinujici, az strasidelny.
vlastne to moc nepouzivame ale neni Callable[...] silne typovane uz tak, jak to je zapsane? Zalezi na kontextu, ale jestli je kontext "jakakoli funkce", tak Callable[...] to typove presne a striktne splnuje ne?
> U plně volitelných parametrů se mnohdy jako výchozí hodnota používá None, což má ovšem jednu nevýhodu – tímto způsobem totiž nelze odlišit explicitní předání None (to je totiž mnohdy zcela validní hodnota) od neuvedení parametru.
Setkal se s tím někdo v praxi? Pokud se pamatuju, řešil jsem rozlišování None ve smyslu žádosti o výchozí hodnotu vs None jako hodnotu samu o sobě jenom jednou, a to jsem páchal zotavující se čtení ze sekvence slovníků. Ale tam by mi výpustek sám o sobě nepomohl, když může None znamenat hodnotu, tak i Ellipsis... Přijde mi hezčí vyrobit si vlastní sentinel.
_sentinel = object()
def get_first_existing_value(key:str, *objs: dict[str,T], default:T|Literal[_sentinel] = _sentinel) -> T:
for o in objs:
try:
return o[key]
except KeyError:
pass
if default is _sentinel:
raise KeyError(key)
return default
PS: díky za ten příklad, kde se zapisuje do Ellipsis. Tohle mě zatím nenapadlo. Jen nevím, jestli to vypovídá spíš o zvyšující se příčetnosti nebo klesající zvědavosti.
Python není Lua, všechno, co potřebovalo referenci na object už ji dostalo a drží si ji hodnotou. Dají se dělat i nové třídy - samozřejmě pokud ve stylu py2 nedědí object - a jejich MRO končí skutečným objectem. Tyhle kousky jazyka budou chodit přes C API a ukecat garbage collector se mi nepodařilo.
>>> actual_object, object=object, None
>>> class Foo:
... def __init__(self):
... print("Init foo")
...
>>> Foo.__mro__
(<class '__main__.Foo'>, <class 'object'>)
>>> Foo.__mro__[-1] is actual_object
True
>>> f = Foo()
Init foo
Ďalšie využite ... ktoré som našiel:
a) Protokoly, aka structural typing
from typing import Protocol
class Greeter(Protocol):
def greet(self) -> str:
...
class Person:
def __init__(self, name: str):
self.name = name
def greet(self) -> str:
return f"Hello, I am {self.name}"
class Robot:
def greet(self) -> str:
return "Beep boop"
class Dog:
def bark(self) -> str:
return "Woof"
def greet(self):
return "Woof! I'm a dog, nice to meet you!"
def welcome(g: Greeter) -> None:
print(g.greet())
p = Person("Alice")
r = Robot()
d = Dog()
welcome(p)
welcome(r)
welcome(d)
print(p.greet())
print(r.greet())
b) stub pyi súbory, a to nie len pre C wrappery, ale aj pre regulárne Python súbory (!!), ktoré nechceme zapratať typmi.
def exit(status: _ExitCode = None, /) -> NoReturn: ...
c) tiež TODO triedy
class Person: ... class Employee(Person): ...
Diq za článok, zasa som sa niečo nové o Pythone dozvedel.