Python - dobré rady a praktiky

čumil

Re:Python - dobré rady a praktiky
« Odpověď #30 kdy: 24. 03. 2016, 18:21:04 »
Trošku se musím dynamického typování zastat. Upřímně, já se aktuálně dynamicky typovaným jazykem živím ...

Napřed aby bylo jasno, dynamické typování je pro mne osobně osina v zadeki. A asi i pro mnoho dalších. Má tunu nevýhod, jako třeba, nikdy nevíš, kdy se ti appka kompletně posere, protože někde uděláš drobnou typovou změnu a ta ti nepozorovaně doplave až do středu systému a tam ti vyletí v ohňostroji exceptions s úplně nahovno stack trace protože obsahuje jen vnitřnosti frameworku který používáš ...

ALE. Dynamické typování je neskutečně silné v jednom. Dělá ze statických, mrtvých systému živé systémy. V kvalitním dynamickém jazyce (platformě přesněji) si můžeš otevřít inspektora do appky, proklikat se jednotlivejma objektama, prohlídnout si jejich interface popřípadě je za běhu upravit. To je neskutečná síla. To že se při těhle úpravách člověk velmi snadno střelí do nohy je jiná...

Můžeš existující systémy zevnitř upravit (monkey patching) či jinak přiohnout podle potřeby.

Dynamické typování je nezbytné pro skutečné OOP postavené na posílání zpráv (nee prosím, opravdu OOP není volání funkcí ve struktuře se skrytým parametrem this ...). V živém systému, totiž nikdy nemůžeš vědět co ti konkrétně přijde a jednotlivý objekty se musí rozumně popasovat s širokou škálou inputů (jako skutečné živé organismy).

To že je to ve výsledku pomalí až běda, při blbým návrhu zabugovaný až běda, je ovšem jiná ...


takynechápe

Re:Python - dobré rady a praktiky
« Odpověď #31 kdy: 24. 03. 2016, 18:26:56 »
Tyhle dynamický změny se dělají běžně u i staticky typovaných jazyků, ne? Ne že bys na nich postavil program stejně jako na monkey patchingu, ale problém to technicky nebude. Nebo co je v tom za problém?

alex

Re:Python - dobré rady a praktiky
« Odpověď #32 kdy: 24. 03. 2016, 18:30:09 »
Stačí ohlídat rozhraní, popřípadě změnu provedete v definici toho objektu, který do metody vkládáte na jednom místě. U staticky typovaného jazyka musíte typy měnit všude v deklaracích, chcete-li aplikaci rozšířit,

A to je cool ne?

To se právě dělá automaticky pomocí IDE, že jo. Hlavně máš často u typů právě jen rozhraní, takže změníš to. Já vlastně zapomněl, že Python rozhraní nepotřebuje, tak všude dáš prostě nadtyp :D To asi ne, že jo.

No, nevím...
Spoléhat na IDE je prasárna stejná jako Copy a Paste. Rozhraní ve smyslu třída argumentu metody má metodu, která se v dané metodě volá :-) K tomu žádný typ nepotřebujete. Odpovídá to taky více realitě, kterou modelujete, dveře má auto i dům, a napasovat je do jednoho typu by nebylo moc šťastné, tím vám právě vznikají nadobjekty. V Pythonu byste si nadeklaroval třídy třeba takto:
class House(building, entrance): pass
class Car(vehicle, entrance): pass
class entrance(object): def open_door(): pass;  def close_door(): pass
nebo totéž můžete provést skládáním objektů parametry v metodách __init__

takynechápe

Re:Python - dobré rady a praktiky
« Odpověď #33 kdy: 24. 03. 2016, 18:36:21 »
Chlape, viděl si někdy větší programy? :D To přijde problém v programu, který si nikdy neviděl a musíš ho opravit. Ne si tam hrát s nějakými nesmysly.

Jaký nadobjekty? Ty máš entrance, ne? Normálně máš rozhraní s open a close. Víc tě nezajímá. Možná jsem pomalejší, ale fakt nechápu.

alex

Re:Python - dobré rady a praktiky
« Odpověď #34 kdy: 24. 03. 2016, 18:48:53 »
Chlape, viděl si někdy větší programy? :D To přijde problém v programu, který si nikdy neviděl a musíš ho opravit. Ne si tam hrát s nějakými nesmysly.

Jaký nadobjekty? Ty máš entrance, ne? Normálně máš rozhraní s open a close. Víc tě nezajímá. Možná jsem pomalejší, ale fakt nechápu.
Tak samozřejmě, časem se systémy zanesou a udržují se jen těžko a není pak příliš velký rozdíl mezi špatným a dobrým návrhem, ovšem když si někdo nevyhrál na začátku, tak se ten systém zanese mnohem dříve :-)))


takynechápe

Re:Python - dobré rady a praktiky
« Odpověď #35 kdy: 24. 03. 2016, 18:55:45 »
Ok, Kite, tak dík za info a už chápu, kdo používá Python.

Kit

Re:python - dobre rady & praktiky
« Odpověď #36 kdy: 24. 03. 2016, 19:05:51 »
Jak se v Pythonu řeší, když vím že potřebuju nějaký int a nic jiného na daném místě nechci?

Úplně stejně, jako v ostatních jazycích, když metoda požaduje jako vstupní parametr třeba číslo měsíce (1..12) a někdo do ní chce narvat třeba 42. Má na to třeba Java datový typ? Nemá. Použiješ int a ošetříš si to vlastním kódem.

V Pythonu se to dá ošetřit pomocí dekorátoru.

čumil

Re:Python - dobré rady a praktiky
« Odpověď #37 kdy: 24. 03. 2016, 19:08:43 »
Tyhle dynamický změny se dělají běžně u i staticky typovaných jazyků, ne? Ne že bys na nich postavil program stejně jako na monkey patchingu, ale problém to technicky nebude. Nebo co je v tom za problém?
V c++/Jave/etc... si mužeš otevřít inspektora a prohrabat se objekty v běžícím systému + modifikovat ho? Ne, není to živá platforma.

takynechápe

Re:Python - dobré rady a praktiky
« Odpověď #38 kdy: 24. 03. 2016, 19:10:59 »
Jak se v Pythonu řeší, když vím že potřebuju nějaký int a nic jiného na daném místě nechci?

Úplně stejně, jako v ostatních jazycích, když metoda požaduje jako vstupní parametr třeba číslo měsíce (1..12) a někdo do ní chce narvat třeba 42. Má na to třeba Java datový typ? Nemá. Použiješ int a ošetříš si to vlastním kódem.

V Pythonu se to dá ošetřit pomocí dekorátoru.

Enum?

V Javě zase anotací, pokud bys to potřeboval... což se nestává tak často :D

Tyhle dynamický změny se dělají běžně u i staticky typovaných jazyků, ne? Ne že bys na nich postavil program stejně jako na monkey patchingu, ale problém to technicky nebude. Nebo co je v tom za problém?
V c++/Jave/etc... si mužeš otevřít inspektora a prohrabat se objekty v běžícím systému + modifikovat ho? Ne, není to živá platforma.

Proč bys nemohl? Možností je víc. Ale uniká mi, proč by to někdo dělal?

čumil

Re:Python - dobré rady a praktiky
« Odpověď #39 kdy: 24. 03. 2016, 19:29:07 »
Jak se v Pythonu řeší, když vím že potřebuju nějaký int a nic jiného na daném místě nechci?

Úplně stejně, jako v ostatních jazycích, když metoda požaduje jako vstupní parametr třeba číslo měsíce (1..12) a někdo do ní chce narvat třeba 42. Má na to třeba Java datový typ? Nemá. Použiješ int a ošetříš si to vlastním kódem.

V Pythonu se to dá ošetřit pomocí dekorátoru.

Enum?

V Javě zase anotací, pokud bys to potřeboval... což se nestává tak často :D

Tyhle dynamický změny se dělají běžně u i staticky typovaných jazyků, ne? Ne že bys na nich postavil program stejně jako na monkey patchingu, ale problém to technicky nebude. Nebo co je v tom za problém?
V c++/Jave/etc... si mužeš otevřít inspektora a prohrabat se objekty v běžícím systému + modifikovat ho? Ne, není to živá platforma.

Proč bys nemohl? Možností je víc. Ale uniká mi, proč by to někdo dělal?
No, nemohl bys. Pokud nevěříš, skus si něco takovýho implementovat.

Poskytuje to insight do systemu a zrychluje to jeho pochopení. Také mužeš zkoušet dělat změny v běžícím systemu a až když najdeš cos hledal, tak to nacpat do zdrojaku. Když je system mali, vyhoda nemusí být zřejmá, když je ale velký, čas mezi změnou a viděným vysledkem je už silně nepohodlný + dostat se do spravneho stavu systemu nemusí být nejrychlejší.

takynechápe

Re:Python - dobré rady a praktiky
« Odpověď #40 kdy: 24. 03. 2016, 19:36:15 »
Právě nevím, co přesně chceš, ale pro normální použití by ti pro Javu měl stačit JRebel, který ti za chodu mění chování. Dá se to udělat i jinak, ale tohle je docela fajn řešení.

Kit

Re:Python - dobré rady a praktiky
« Odpověď #41 kdy: 24. 03. 2016, 19:49:01 »
Jak se v Pythonu řeší, když vím že potřebuju nějaký int a nic jiného na daném místě nechci?

Úplně stejně, jako v ostatních jazycích, když metoda požaduje jako vstupní parametr třeba číslo měsíce (1..12) a někdo do ní chce narvat třeba 42. Má na to třeba Java datový typ? Nemá. Použiješ int a ošetříš si to vlastním kódem.

V Pythonu se to dá ošetřit pomocí dekorátoru.

Enum?

V Javě zase anotací, pokud bys to potřeboval... což se nestává tak často :D

Enum v Javě funguje trochu jinak - pro čísla měsíců to zrovna použitelné není.

Ten příklad s číslem měsíce jsem uvedl proto, že se v reálu nepoužívají jen typy int, float nebo String. Používají se i jejich podmnožiny, intervaly, řetězce určitých vlastností apod. Najednou jsou staticky typované jazyky na stejném levelu jako dynamicky typované - aplikace si to musí ošetřit samy bez významnější podpory kompilátoru.

Jistě, v Javě se k tomu dají využít anotace, v Pythonu dekorátory. Vypadá to dost podobně.

Raskal

Re:Python - dobré rady a praktiky
« Odpověď #42 kdy: 24. 03. 2016, 19:51:59 »
Python je vhodny pro velke aplikace, ale ma mnohem vetsi naroky na programatora nez napriklad Java - dobry partner pro srovnani z rady staticky typovanych jazyku.

Problem Pythonu *je* zaroven jeho nejvetsi prednosti a to je prave beztypovost. Daji se v nem delat konstrukce, ktere lze v typovanem jazyce jen tezko vytvorit a to s pouzitim velmi maleho poctu radku kodu. Nemuze v nem delat kazdy, pokud ma vysledek stat za to (to plati asi vsude) a zaroven ma kazdemu co nabidnout az do jeho urovne programovani. Velke aplikace v Pythonu vyzaduji mnohem vetsi usili vynalozene na to, aby byla aplikace robustni a vyvoj udrzitelny. Neznamena to ale, ze v nem nelze delat stejne kvalitni a robustni kod jako v typovanem jazyce. Nema takovou podporu IDE jako ma Java a bylo do nej napumpovano radove mene penez nez do Javy, takze je to pochopitelne. Osobne nejvetsim zaporem Pythonu chapu to, ze nema stejne dobrou podporu pro refaktoring, jakou ma Java.

Staticky typovane jazyky nejsou konkurenty Pythonu a beztypovych jazyku a proto ani nema cenu se dohadovat o tom, ktery jazyk je lepsi. Kazdy vazne mysleny jazyk je na neco lepsi nez jiny jazyk a kazdy dobry jazyk je na neco mene vhodny nez nejaky jiny jazyk.

Python ma podporu typu parametru, ma podporu pro interface, ma podporu pro kde co.

Program v Pythonu nemusi byt pomaly a muze byt srovnatelne rychly s programem v cecku - velky krok v tom udelal projekt PyPy (http://pypy.org/ http://speed.pypy.org/). Napriklad pokud je program v cecku 5x rychlejsi nez stejny program v Pythonu, pak to je pro me vitezstvi Pythonu. PyPy je velmi zajimavy projekt nejen s ohledem na rychlost vm.

Python nema problem s tridami vytvorenymi na miru ani na jedno puziti, jako ma napriklad Java (permgem space az do verze 1.8) a metatridy jsou konceptem, ktery je mozne vyuzit, ale neni to nutne. Pokud chci stabilitu, rychlost a bezpecnost bez vetsi namahy, pak programuji v Jave. Pokud chci volnost, flexibilit a inovativni reseni, pak je Python dobra volba. V Pythonu lze za behu zmenit treba tridu a to bez neprijemnych dusledku, coz v Jave neni mozne (nejlepe je na tom asi dcevm).

Jako materialy muzu doporucit oficialni tutorial k Pythonu a studium zdrojovych kodu ruznych knihovnen pro Python, protoze je psali lidi, kteri o tom neco vedi. Nez se clovek dostane na urcitou uroven, tak to docela trva. Nejde ani tak o to znat samotny jazyk, ten neni az tak slozity. Znat jeho moznosti a vybaveni, to uz je na mnohem delsi dobu. Naucit se to pouzivat jako celek a umet v nem efektivne myslet, to uz je skoro programatoruv zivotni styl.

Pro praci a vyvoj v Pythonu urcite doporucuji nekterou z Linuxovych distribuci vybavenych balickovacim systemem.

http://python.cz/
https://www.python.org/
http://ipython.org/
https://www.jetbrains.com/pycharm/
http://www.pydev.org/
https://pypi.python.org/
https://virtualenv.pypa.io/
http://www.sqlalchemy.org/
https://wiki.python.org/moin/WebFrameworks/
http://pypy.org/

takynechápe

Re:Python - dobré rady a praktiky
« Odpověď #43 kdy: 24. 03. 2016, 19:56:45 »
V Pythonu lze za behu zmenit treba tridu a to bez neprijemnych dusledku, coz v Jave neni mozne (nejlepe je na tom asi dcevm).

Co s tím všichni máte? K čemu by to asi tak bylo, že od 10. minuty můj program funguje jinak? To se normálně dělá trochu jinak než dynamickou změnou třídy za chodu :D

Re:Python - dobré rady a praktiky
« Odpověď #44 kdy: 24. 03. 2016, 20:00:20 »
Problem Pythonu *je* zaroven jeho nejvetsi prednosti a to je prave beztypovost.

Já bych chtěl vysvětlení té beztypovosti (různé zdroje se v této interpretaci liší); a kdyby to rozsekl Radek Miček bylo by to fajn .)