Type hints

25 views
Skip to first unread message

Jan Walter

unread,
Mar 5, 2018, 4:34:37 PM3/5/18
to djan...@googlegroups.com
Ahoj vespolek,

vycházím z paradigmatu dynamicky typovaných jazyků, nejvíc jsem toho napsal v JavaScriptu, ale i s Pythonem jsem strávil nějaký čas. Stejně jako jsem si rychle oblíbil jeho estetiku, zamiloval jsem si (ač jsem se apriori dlouho bránil) implementaci statických typů v TypeScriptu vč. podle mýho soudu fantastický inference.

Zřejmě mě zas čeká období, kdy budu psát i v Pythonu a chtěl bych se Vás zeptat, jestli Python nabízí něco podobného, přesněji jak to je oblíbené, používané, kvalitní, smysluplné. Budu rád za jakýkoli názor, zkušenost, doporučení, případně srovnání. Očekávám (co mi TS dal obecně): další vrstvu kontroly při psaní kódu spjatou s dokumentační vrstvou, pomoc při psaní kódu a jednodušší refactoring.

Díky,
John

Jan Bednařík

unread,
Mar 5, 2018, 6:02:56 PM3/5/18
to djan...@googlegroups.com
Ahoj,

TLDR: Tu další vrstvu kontroly, dokumentace a jednoduchý refactoring, ti mohou dát jen a pouze testy. Mrkni se na výbornou knihovnu pytest


V Pythonu existují "type hints", ale je otázka, jestli někdy budou nějak více používány. Ono se to totiž jeví jako dobrý nápad někomu, kdo přichází ze staticky typovaného jazyka, ale jen do doby, než se s Python více sžije, a zjistí, že to k ničemu nepotřebuje.

Python tohle řeší elegantně silnou typovou kontrolou. Pádem programu tě upozorní, že se pokoušíš o nějakou hloupost, jako třeba vynásobit sting a int. A obvykle ti k tomu dá pěknou chybovou hlášku. Jsou to ale v zásadě vyjímečné případy, kvůli kterým nemá cenu zavádět statické typování. Je to zásadní rozdíl oproti jiným dynamicky typovaným jazykům se slabou typovou kontrolou, jako třeba ten JavaScript, kde můžeš míchat typy skoro jakkoliv.

Zároveň tě ale Python nesvazuje konkrétními typy. Většinou ti na konkrétním typu nezáleží. Když pracuješ s číslem, tak je ti jedno, jestli je to int, float, či jíný typ. Když iteruješ nad kolekcí, tak je ti jedno, co to je, hlavně že tím jde iterovat. V situacích, kde na tom typu záleží, obvykle pracuješ v kontextu nějaké knihovny, která definuje vlastní typy, a tam se zas nespleteš díky tomu kontextu.

Tu další vrstvu kontroly při psaní kódu, spjatou s dokumentační vrstvou a jednodužší refactoring, ti statické typy nedají. To je taková iluze staticky typovaných jazyků, že když to jde zkompilovat, tak je to v pořádku. Dokud to není pokryté testy, tak tam jsou stejně chyby. A když máš testy, tak víš, že jsi nikde typy nepopletl, i bez zbytečně omezujících statických typů.

Honza

--
--
E-mailová skupina djan...@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „django-cs“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete e-mail na adresu django-cs+unsubscribe@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/CAK-vJUn3t7icUj5S6PDSabS0JcRr18hDZuX96n-C7cjc479PGA%40mail.gmail.com.
Další možnosti najdete na https://groups.google.com/d/optout.

Beda Kosata

unread,
Mar 6, 2018, 2:35:23 AM3/6/18
to djan...@googlegroups.com
Ahoj,

já bych ty type hints zase tak nezavrhoval. Minimálně je to další kus
dokumentace ke kódu a když to Tvůj editor umí, tak to může pomáhat i
code completion, atp. Já osobně jsem to ve svém kódu začal používat a
rozhodně u toho zůstanu, protože mi to pomáhá v přehlednosti kódu a
tedy jeho jednodušším pozdějším čtení.

Celé je to součástí novějších verzí pythonu 3 (3.5 a výš) a rozumně
popsané je to v základní dokumentaci:
https://docs.python.org/3/library/typing.html

Mějte se

Beda
>> zašlete e-mail na adresu django-cs+...@googlegroups.com.
>> Chcete-li tuto diskusi zobrazit na webu, navštivte
>> https://groups.google.com/d/msgid/django-cs/CAK-vJUn3t7icUj5S6PDSabS0JcRr18hDZuX96n-C7cjc479PGA%40mail.gmail.com.
>> Další možnosti najdete na https://groups.google.com/d/optout.
>
>
> --
> --
> E-mailová skupina djan...@googlegroups.com
> Správa: http://groups.google.cz/group/django-cs
> ---
> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny
> „django-cs“ ve Skupinách Google.
> Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny,
> zašlete e-mail na adresu django-cs+...@googlegroups.com.
> Chcete-li tuto diskusi zobrazit na webu, navštivte
> https://groups.google.com/d/msgid/django-cs/CAMmgUkPQcLweMkkgTrEGJaHMMYZAZxA47amXmGdAR_Y5qW4-mQ%40mail.gmail.com.

Václav Řehák

unread,
Mar 6, 2018, 5:15:40 AM3/6/18
to djan...@googlegroups.com
Názory na type hints asi budou různé, ale faktem je, že Guido docela hodně mluví o tom, jak se jim to v Dropboxu osvědčilo, takže pozornost se tomu věnuje a osobně bych očekával, že popularita poroste.

Praktickou zkušenost nemám (stejně jako Honza spíš spolehám na testy), ale třeba PyCharm nějakou podporu má: https://www.jetbrains.com/help/pycharm/type-hinting-in-pycharm.html

Vašek

Dne 5. března 2018 22:34 Jan Walter <jnw...@gmail.com> napsal(a):

--
--
E-mailová skupina djan...@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „django-cs“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete e-mail na adresu django-cs+unsubscribe@googlegroups.com.

Pavel Schön

unread,
Mar 6, 2018, 5:53:38 AM3/6/18
to django-cs
Python tohle řeší elegantně silnou typovou kontrolou. Pádem programu tě upozorní, že se pokoušíš o nějakou hloupost, jako třeba vynásobit sting a int. A obvykle ti k tomu dá pěknou chybovou hlášku.

Tak zrovna toto je spatny priklad, protoze nasobeni string a int je podporovana operace
>>> 'x'*0
''

Jan Bednařík

unread,
Mar 6, 2018, 7:11:01 AM3/6/18
to djan...@googlegroups.com
Jo, měl jsem tam dát součet, to by byl lepší příklad.

Nicméně i když se dá v pythonu udělat '3' * 2, tak z toho vyleze string a ne integer, tak to obvykle padne někde kousek dál. Problém třeba toho JavaScriptu je ten, že z '3' * 2 vyleze integer, a všechno se jeví v pořádku.

Jan Bednařík

unread,
Mar 6, 2018, 7:15:14 AM3/6/18
to djan...@googlegroups.com
Ještě jsem zapoměl dodat, že ten string z pythonu obsahuje navíc nesmyslnou hodnotu '3' * 2 == '33'. Tak to člověka trkne podle hodnoty (v testech), i kdyby si náhodou nevšiml, že je to string. V JS je: '3' * 2 == 6 tak je ta chyba hrozně nenápadná.

Vláďa Macek

unread,
Mar 6, 2018, 7:31:08 AM3/6/18
to djan...@googlegroups.com
> nesmyslnou hodnotu '3' * 2 == '33'

Ani v nejmenším to není nesmyslné, je to standardní definované chování.
Programátor má skutečně vědět, jakého typu jsou a tedy jaké schopnosti mají
objekty, se kterými pracuje. Jak by jinak mohl programovat? To je přece
naprostý základ.

Obecnější dotazy:

S verzí 3.5 tedy přibyl type hinting. Používají to IDE apod. pro statické
kontroly kódu, doc generátory(?). Vy, co sledujete nové dění víc:

1) Jaký je kromě PyCharmu další rozšířenější software, který to prakticky
strojově používá a jak? Klidně víc.

2) Je nějaká praxe warningů samotného interpretu?

3) Začíná se uvažovat o vynucování striktního typování, tj. že s hintů by
se staly asserty?

Neptám se, jestli by to bylo dobře, ani netvrdím, že na to čekám (nečekám).

Díky,

Vláďa


On 6.3.2018 13:14, Jan Bednařík wrote:
> Ještě jsem zapoměl dodat, že ten string z pythonu obsahuje navíc
> nesmyslnou hodnotu '3' * 2 == '33'. Tak to člověka trkne podle hodnoty (v
> testech), i kdyby si náhodou nevšiml, že je to string. V JS je: '3' * 2
> == 6 tak je ta chyba hrozně nenápadná.
>
> 2018-03-06 13:10 GMT+01:00 Jan Bednařík <jan.be...@gmail.com
> <mailto:jan.be...@gmail.com>>:
>
>
>
> 2018-03-06 11:53 GMT+01:00 Pavel Schön <pa...@schon.cz
> <mailto:pa...@schon.cz>>:

Jan Bednařík

unread,
Mar 6, 2018, 7:55:00 AM3/6/18
to djan...@googlegroups.com
2018-03-06 13:31 GMT+01:00 Vláďa Macek <ma...@sandbox.cz>:
> nesmyslnou hodnotu '3' * 2 == '33'

Ani v nejmenším to není nesmyslné, je to standardní definované chování.
Programátor má skutečně vědět, jakého typu jsou a tedy jaké schopnosti mají
objekty, se kterými pracuje. Jak by jinak mohl programovat? To je přece
naprostý základ.

Jo, ale je rozdíl, když víš že zrovna pracuješ se stringem a číslem a očekáváš tohle chování. A nebo když si zapoměl ošetřit vstup, převést string na int, a ačkoliv si myslíš, že pracuješ s čísly a očekáváš že výsledkem operace bude číslo, tak tomu tak není. Argument pro statické typy nebo typové anotace je ten, že tě to upozorní na ten neošetřený vstup, či špatný typ na výstupu, už při psaní kódu.

Ale jak už jsem psal, bez testů je to stejně jedno. Záleží na hodnotách proměnných. Třeba při pokusu o dělení nulou je houby platné, že nula je integer a prošlo to statickou typovou kontrolou.

Honza

 
--
--
E-mailová skupina djan...@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny django-cs ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny, zašlete e-mail na adresu django-cs+unsubscribe@googlegroups.com.
Chcete-li zobrazit tuto diskusi na webu, navštivte https://groups.google.com/d/msgid/django-cs/6f9034c8-9c5a-7d37-2a6a-28ac33d6cae7%40sandbox.cz.
Další možnosti najdete na adrese https://groups.google.com/d/optout.

Petr Viktorin

unread,
Mar 6, 2018, 8:10:18 AM3/6/18
to djan...@googlegroups.com, Vláďa Macek


On 03/06/18 13:31, Vláďa Macek wrote:
>> nesmyslnou hodnotu '3' * 2 == '33'
>
> Ani v nejmenším to není nesmyslné, je to standardní definované chování.
> Programátor má skutečně vědět, jakého typu jsou a tedy jaké schopnosti mají
> objekty, se kterými pracuje. Jak by jinak mohl programovat? To je přece
> naprostý základ.
>
> Obecnější dotazy:
>
> S verzí 3.5 tedy přibyl type hinting. Používají to IDE apod. pro statické
> kontroly kódu, doc generátory(?). Vy, co sledujete nové dění víc:
>
> 1) Jaký je kromě PyCharmu další rozšířenější software, který to prakticky
> strojově používá a jak? Klidně víc.

mypy, linter (dělá statickou analýzu kódu): http://mypy-lang.org/


> 2) Je nějaká praxe warningů samotného interpretu?

Ne, a není to v plánu. Statická kontrola do runtime nepatří.


> 3) Začíná se uvažovat o vynucování striktního typování, tj. že s hintů by
> se staly asserty?

Ne. Všechny návrhové dokumenty okolo, včetně toho posledního [0],
explicitně říkají že o tohle se nesnaží a snažit nechtějí.

[0] https://www.python.org/dev/peps/pep-0563/#non-goals
Reply all
Reply to author
Forward
0 new messages