Tak psát, že je něco zastaralé, když to přišlo ve verzi 3.10 (aktuální je 3.11), je hodně odvážné. Ne že by to nebylo kratší ,ale je to zase míň explicitní.
Dle mého přidávaj syntaxi jak pejsek s kočičkou.
Taky je tu dost kódu za ty roky, kde se s tím potkáš, tak si prostě zvykni na oba zápisy. Určitě nikdo nepůjde do knihoven a nebude tuhle prkotinu řešit.
Občas mne svrbí prsty, když někde najdu vlastní zataralý zápis List[T]. Nakonec, ale si říkám, že je to vlastně mnohem logičtější než zápis list[t] a přepis fakt ničemu nepomůže -- nechávám to ležet.
V tom PEPu taky navždy zůstane "zastaralé" List[T]: https://peps.python.org/pep-0604/#simplified-syntax
Dle mého je třeba čitelnější `Optional[A]` než `A | None`, ale to je asi subjektivní.
Toť můj názor.
20. 6. 2023, 09:30 editováno autorem komentáře
Pochopitelně nesouhlasím. Zde je poměrně dobře vyargumentováno, proč Optional lépe dokumentuje záměr/význam přípustných typů: https://stackoverflow.com/questions/51710037/how-should-i-use-the-optional-type-hint/51710151#51710151
To je pravda, že to na konci píše, ale podle mě to není moc konzistentní s argumentací předtím: The None value is not a 'subwidget id' after all, it's not part of the value, None is meant to flag the absence of a value.
On tam teda používá řešení typového aliasu, ale stejně mi přijde výrazně lepší psát
Optiona[str | int]
než
str | int | None
21. 6. 2023, 08:07 editováno autorem komentáře
3.10 je skoro 2 roky stará verze, není jediný rozumný důvod, proč používat v novém článku zastaralý zápis, když nový vznikl právě kvůli jeho nedostatku.
Já vůbec neříkám to přepisovat ve starém kódu, ale snad nikdo příčetný (kdo nepotřebuje kompatibilitu i se starou verzí Pythonu) nebude používat List s importem místo list.
Jestli se nepletu tak zápis A | None je preferovaná varianta. Já používám | kvůli tomu, že se nemusí nic importovat. Kdo neví co je typ Optional to ihned pochopí a nemusí zjišťovat, jestli náhodou není Optional nějaká class (jako například v Java).
Máte asi pravdu, dneska už s >= 3.11 (hmm to mi něco připomíná) máme kratší způsob zápisu. Já jsem použil ten o něco starší ze dvou důvodů:
1) velká část code base používá starší způsob zápisu
2) (IMHO) původní zápis umožňuje IDEčkám, aby lépe zobrazily, o co se jedná. Přecejen | už je přetížený znak a dovedu si představit, že to začátečníky bude mást. Kdežto po najetí na Union/Option atd. bude vše jasné. Ale jak říkám toto je jen IMHO a můj soukromý názor na to, jak by asi zápis v Pythonu měl být sice stručný, ale hlavně pochopitelný (po všech těch změnách, z poslední doby :-).
Jak už jsem psal problém s Optional a Union je, že musíte vědět, že to je jenom syntaxe pro typový systém a není to třeba class jako Optional v Java a že na vstup nema přijít něco jako foo(Optional(42)) naproti tomu se | jako or používá skoro v každém jazyce.
IDE si poradí s obojím (aspoň ty novější), přece jen ta syntaxe je už 2 roky stará.
Mimochodem nově by měli přibýt také zápis pro generika v 3.12 https://peps.python.org/pep-0695/ . Takže pak půjde napsat jenom:
def funcT -> T:
A tohle je teda opravdu snažší a čitelnější než používat Generic a TypeVar
Tak Vám to Pavel T. vysvětlil velmi pěkně, slušně až diplomaticky. Ale vy si nedáte pokoj.V první části opakujete už několikrát zde protlačovaný blábol.
Nejsem sám kdo Vám tady píše, že to je "dle mého" míň srozumitelné. Optional je lepší na oči a lepší pro IDE. Žádná podobnost s Javou tam nevidím. Pokud děláte v Pythonu déle než týden, tak Vám tohle je jasné.
Ve druhé části "mimochodem", máte pravdu, ale úplně se odkláníte od tématu.
Python typový systém vložený do dynamického jazyka není občas pěkné čtení v kódu. Ukecaností to trumfne i Javu někdy viz Generic, TypeVar, NewType. Pro začátečníky docela peklíčko vyznast se v syntaxi. Mnohokrát přetížený znak | tomu vůbec nepomáhá.
21. 6. 2023, 09:39 editováno autorem komentáře
Tak když už jste tak chytrý jak rádio tak tady dokažte ten blábol, že Optional je lepší pro IDE. Protože Optional je jenom alias pro Union a ten je úplně stejný jako | .
Mimochodem v typing je Optional jenom:
return Union[arg, type(None)]
Takže i kdyby se IDE k Optional chovalo z nějakého důvodu jinak, tak se musí k Union a | s None chovat stejně.
To, že podobnost s Java nevidíte je váš problém. Mimochodem Optional v Java je class, která má "nahradit" null/None, takže výsledek je buď hodnota nebo empty.
V Python typovém systému je těžké rozeznat co je jenom alias nebo co je opravdu typ (class).
Takže abych to shrnul, jediný vás argument je, že vám to subjektivně připadá lepší. Optional jste do toho začal míchat vy, já jenom psal, že nedává smysl používat typing.Dict místo dict a typing.Union místo |.
OK beru zpět, je to lepší pro oči, abych ukončil vašě točení se v kruhu. Psal o tom PT. Popravdě psal sám i toto: "původní zápis umožňuje IDEčkám, aby lépe zobrazily, o co se jedná." Tak si vyžádejte tím Vaším zpusobem vysvětlění od něj. Já na Vás nemám nervy a nejsem tak vyklidněný jako on. Což je pro něj samozřejmě kompliment.
21. 6. 2023, 13:43 editováno autorem komentáře