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
Jestli se pamatuju dobře, tak tohle konkrétně nikdo netvrdil. Je tam
Object-Oriented Programming Features of Rust
We’ll then show you how to implement an object-oriented design pattern in Rust and discuss the trade-offs of doing so versus implementing a solution using some of Rust’s strengths instead.
Python je OOP rozhodně víc než Rust, ale to neznamená, že všechno v něm chceme a musíme modelovat OOP-style. Třídy apod. jsou jeden z nástrojů, proti tomu nic. No a proto mě tedy zajímalo, o akú objektovú paradigmu šlo OP.
21. 6. 2023, 12:14 editováno autorem komentáře
Kay sám litoval, že slovo objekt vůbec použil. Podle jeho vidění by z ostatních jazyků asi nejvíc vyhovoval Erlang. Nicméně je tu i jiný zajímavý OOP matador a to B. Meyer a jeho Eiffel (https://en.wikipedia.org/wiki/Bertrand_Meyer) Jazyk i jeho knihy jsou hodně zajímavé. Prostě OOP z různých pohledů a s různými úpravami může dávat smysl. Není důvod ho zašlapávat.
Jak řekl Armstrong: The problem with object-oriented languages is they’ve got all this implicit environment that they carry around with them. You wanted a banana but what you got was a gorilla holding the banana and the entire jungle.
Jak bych řekl já: Když znáš jenom Python, všechno vypadá jako džungle .D
**Možná snad i Objective-C se vlastně do jeho definice docela vejde, ale nevím, s Applem už dávno nejsem v kontaktu.
21. 6. 2023, 12:50 editováno autorem komentáře
Já psal v ObjC hlavně pro iOS. Současná verze jazyka je poměrně moderní, ale to je stejně k ničemu, když to Apple zazdil Swiftem. Teď do Swiftu začal přepisovat i frameworky (Cocoa, Foundation apod.).
Jinak Swift má v sobě "objc" mód s ObjC runtimem (jen na macOS, ne Linuxu), takže na macOS vlastně Kayovu definici OOP taky splňuje. Ale je to jazyk v jazyce (něco jako Java bridge (ne)blahé paměti).
Jo tohle me taky fascinuje.
Kazdej potroubek blekota o java dinosaurech, aby pak ten vehement horkotezko za pomoci rovnaku na ohybaky dobastlil aspon na uroven Javy 1.5
A v JS svete vsecko co ma nohy zdrha do Typescriptu, ktery ma dokonce nekolik featur lepsich nez Java, viz union a nonnullable types.
Hlavne ze hello world jde napsat na jeden radek, to je krucialni featura kazdeho jazyka....
Zdravím Pavle,
díky za články, je to vždycky inspirace.
Jinak, pozor na věci jako:
from typing import List, Dict, Callable, Generator # apod.
To už je od verze 3.9 deprecated a měly by se používat builtins nebo collections, viz https://docs.python.org/3/library/typing.html?highlight=typing#deprecated-aliases
Přijde mi to stejný bordel jako při přechodu mezi 2 a 3. "Zavedou" typový systém a pořád ho pod rukama mění. Nějak nevidím vůbec žádný benefit najednou importovat `from collections.abc import Callable` namísto modulu `typing`... kde je mi fakt jasné, že importuju cokoliv pro typové anotace. Nechám se přesvědčit že je za tím nějaký dlouhodobý zámer, nemám čas dohledávat PEPy.