Re: [python] (ne)logičnost .join() ?

2011-02-28 Tema obsahu Petr Přikryl

Trochu popřehazuji pořadí...

Radek rad...@gmail.com napsal...
 On 23 ún, 08:08, Petr Přikryl prik...@atlas.cz wrote:
 A co se týká volně rozhozených built-in funkcí,
 ono jich zase tak strašně moc není. Nezvyklé je
 to hlavně pro lidi, kteří pracovali v čistě OO
 jazyce, který funkce nepodporuje
 
 jo, asi tak nějak. Teď by bodl dokument: Jak
 zobjektit Python v místech kde se tomu brání,
 resp. kde to ještě nikdo neudělal.
 
 To je asi to nejtrefnější: Přesně v místech kdy
 Python nesleduje objektové principy to bolí, a
 strašně.

Ono je trošku problematické říci, že Python nesleduje
objektové principy. V Pythonu je totiž objektem všechno.
Podle mého názoru dogma čistě objektového přístupu, kdy je
veškerá funkčnost realizována metodami objektů, neodpovídá
realitě, která nás obklopuje. Neodpovídá ani matematickým
abstrakcím, které nás obklopují od základní školy.

Pokud vás tedy něco strašně bolí, pak je to porušení oněch
dogmat, které byste si přál bezhlavě následovat.

Metody tříd jsou formálním způsobem popisu chování objektů
dané třídy. Vychází se z poznatku, že při formálním zápisu
transformace vnitřního stavu objektu uděláme méně chyb, když
popis spojíme s abstrakcí objektu dané třídy. Vychází to ze
zkušenosti, že například v určitém kontextu se celé číslo 
musí chápat jako letopočet a ne jako počet kusů něčeho nebo
jako zcela abstraktní číslo. Až potud nelze nic namítat.

Existují ale situace, kdy chceme s určitou hodnotou pracovat
jako s velmi abstraktní hodnotou -- jaksi bez kontextu --,
kdy jí chceme interpretaci přidělit až v okamžiku
zpracování. Dám příklad. Mnohé reálné objekty lze v určitých
situacích popsat vektorem v trojrozměrném prostoru. 
Přirozeným způsobem můžeme dojít k
nějakému dejme tomu geometrickému úhlu, který je prostě
úhlem bez bližší vazby na konkrétní objekt. Dejme tomu, že
na daný úhel potřebujeme aplikovat to, čemu od základní
školy říkáme funkce sinus. V takové situaci je velmi obtížné
považovat zápis

  objekt.vektor.úhel.sin()
  
za přirozené vyjádření toho, co nás u onoho úhlu daného
objektu zajímá. Mnohem přirozenější pro nás je zápis, kdy se
úhel stane argumentem obecné funkce sin().

 Každý má jiný pohled na věc a jiná očekávání.
 Podle mého názoru je přístup typu
 ','.join(kontejner) možná na první pohled
 nezvyklý, ale na druhý pohled je velmi logický.
 Jde o to, že dokáže spojit zadaným řetězcem prvky
 dodané jakýmkoliv kontejnerem, který podporuje
 iteraci a který vrací řetězcové prvky.
 
 Zajisté, pro implemetátora má smysl to definovat
 na jednom místě. Takže by byl dobrý mixin nebo
 třída která implementuje metody nad iterabilními
 kontejnery, a ty iterabilní kontejnery podědí nebo
 si ty metody mixnou.

Tohle je jen technický detail, který umožní svázat nějakou 
operaci s nějakou třídou objektu. Pořád bychom si měli
uvědomovat, že tečková notace používaná u OO jazyků je pouze
notací, která má usnadnit vnímání náležitosti metod k
objektům. Taková notace je přínosná v situacích, kdy máme
pocit, že je její přínos přirozený. Tím mám na mysli to, že
zápis pokud možno snadno pochopí i ten (se stručným návodem),
kdo takový zápis vidí poprvé.

 Ale když pracujete tak chcete psat něco jako
 
 neco.jeho_kolekce.transform.sort.jeste_transform.join

Tohle považuji za poměrně nešťastné v jakémkoliv OO jazyce.
Přesněji, netýká se to jazyka, ale jeho používání. Nezávisle
na tom, zda se jedná o reference nebo ukazatele... Pokud má
transformace join probíhat na konci uvedeného řetězu, pak
musí být zajištěno, že předchozí transformace nějak
neselžou. To z hlediska robustnosti kódu nemusí být tak
samozřejmé.

 a nemáte chuť psát
 
 join(neco.jeho_kolekce.transform.sort.jeste_transform)

Tady je potřeba si uvědomit, že metoda str.join(), o které
se tady bavíme, je velmi specifická v tom smyslu, že jde o
metodu, která má spojovat několik podřetězců do jednoho
řetězce. Je tedy specifická v tom, že pracuje nad řetězci
ve velmi abstraktní podobě a že výsledkem je zase čistý
řetězec. V souvislosti s výše uvedeným příkladem úhlu a
funkce sinus je to něco podobného.

 obzvláště když ten řetězec chcete na tečce dále
 zpracovávat.
 
 neco.jeho_kolekce.transform.sort.jeste_transform
 .join.strip.jiny_transform.split

Přehlédl jste ale jeden detail. Na začátku celé transformace
vystupuje objekt nějakého typu, který se postupně
transformuje do kolekce řetězců. Potom následuje změna velmi
specifické kolekce řetězců na velmi abstraktní typ
řetězec. Další operace probíhají nad abstraktním řetězcem.

 když to pak přepíšete do závorkové notace, tak je
 to nečitelné, protože v závorkové notaci se píše
 doleva a v tečkové doprava. Pár takových závorek v
 tečkovaném výrazu a nevyzná se v tom ani zvíře
 které to má v popisu práce.

Tohle není věc tečkové/závorkové notace. To je věc
přehledného zápisu programu.

 A nebo jinak. Kolikrát v životě jste potřebovali
 aplikovat join na řetězec v tečce? Já si
 nepamatuju jediný případ.

Osobně mi kroutí mozkem vyjádření aplikovat join na řetězec
v tečce. 

Re: [python] (ne)logičnost .join() ?

2011-02-23 Tema obsahu Ondrej Beranek
a tim i programátora. Tedy zbývá jen vyřešit zda byla první slepice nebo
vjece :)

2011/2/23 Tomas Brabenec konfere...@brabenec.net

 Dne 23.2.2011 8:08, Petr Přikryl napsal(a):

  Něco jak seznam.join(',').  Tohle je naštěstí tak profláknuté, že už
 jsem si zapamatoval že v Pythonu je join metoda toho ',' a ne toho
 pole.

 Tak nie som jedný, komu sa zdá, že to má Python opačne. :-)

 já jsem stráášně rozmlsaný z Ruby kde všechno má svou logiku.  Po
 nějaké chvíli člověk začne psát příkazy/metody intuitivně bez
 konzultace s dokumentací a všechno funguje.

 Každý má jiný pohled na věc a jiná očekávání. Podle mého názoru
 je přístup typu ','.join(kontejner) možná na první pohled nezvyklý,
 ale na druhý pohled je velmi logický. Jde o to, že dokáže spojit
 zadaným řetězcem prvky dodané jakýmkoliv kontejnerem,
 který podporuje iteraci a který vrací řetězcové prvky.

 Souhlasím, mě osobně to přijde naprosto logické. Je to skutečně o úhlu
 pohledu a zvyklostech jazyka :-D


 T.

 ___
 Python mailing list
 Python@py.cz
 http://www.py.cz/mailman/listinfo/python

___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python

Re: [python] (ne)logičnost .join() ?

2011-02-23 Tema obsahu Radek
On 23 ún, 08:08, Petr Přikryl prik...@atlas.cz wrote:
 Každý má jiný pohled na věc a jiná očekávání. Podle mého názoru
 je přístup typu ','.join(kontejner) možná na první pohled nezvyklý,
 ale na druhý pohled je velmi logický. Jde o to, že dokáže spojit
 zadaným řetězcem prvky dodané jakýmkoliv kontejnerem,
 který podporuje iteraci a který vrací řetězcové prvky.

Zajisté, pro implemetátora má smysl to definovat na jednom místě.
Takže by byl dobrý mixin nebo třída která implementuje metody nad
iterabilními kontejnery, a ty iterabilní kontejnery podědí nebo si ty
metody mixnou.

Ale když pracujete tak chcete psat něco jako

neco.jeho_kolekce.transform.sort.jeste_transform.join

a nemáte chuť psát

   join(neco.jeho_kolekce.transform.sort.jeste_transform)

obzvláště když ten řetězec chcete na tečce dále zpracovávat.

 
neco.jeho_kolekce.transform.sort.jeste_transform.join.strip.jiny_transform.split

když to pak přepíšete do závorkové notace, tak je to nečitelné,
protože v závorkové notaci se píše doleva a v tečkové doprava.  Pár
takových závorek v tečkovaném výrazu a nevyzná se v tom ani zvíře
které to má v popisu práce.

A nebo jinak.  Kolikrát v životě jste potřebovali aplikovat join na
řetězec v tečce?
Já si nepamatuju jediný případ.

 A co se týká volně rozhozených built-in funkcí, ono jich zase
 tak strašně moc není. Nezvyklé je to hlavně pro lidi, kteří
 pracovali v čistě OO jazyce, který funkce nepodporuje

jo, asi tak nějak.  Teď by bodl dokument: Jak zobjektit Python v
místech kde se tomu brání, resp. kde to ještě nikdo neudělal.

To je asi to nejtrefnější:  Přesně v místech kdy Python nesleduje
objektové principy to bolí, a strašně.


___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python


[python] (ne)logičnost .join() ?

2011-02-22 Tema obsahu Petr Přikryl

  Něco jak seznam.join(',').  Tohle je naštěstí tak profláknuté, že už
  jsem si zapamatoval že v Pythonu je join metoda toho ',' a ne toho
  pole.

 Tak nie som jedný, komu sa zdá, že to má Python opačne. :-)

já jsem stráášně rozmlsaný z Ruby kde všechno má svou logiku.  Po
nějaké chvíli člověk začne psát příkazy/metody intuitivně bez
konzultace s dokumentací a všechno funguje.

Každý má jiný pohled na věc a jiná očekávání. Podle mého názoru
je přístup typu ','.join(kontejner) možná na první pohled nezvyklý,
ale na druhý pohled je velmi logický. Jde o to, že dokáže spojit
zadaným řetězcem prvky dodané jakýmkoliv kontejnerem,
který podporuje iteraci a který vrací řetězcové prvky.

A co se týká volně rozhozených built-in funkcí, ono jich zase
tak strašně moc není. Nezvyklé je to hlavně pro lidi, kteří
pracovali v čistě OO jazyce, který funkce nepodporuje.
Viz tady 

http://docs.python.org/library/functions.html

P.
___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python


Re: [python] (ne)logičnost .join() ?

2011-02-22 Tema obsahu Tomas Brabenec

Dne 23.2.2011 8:08, Petr Přikryl napsal(a):

Něco jak seznam.join(',').  Tohle je naštěstí tak profláknuté, že už
jsem si zapamatoval že v Pythonu je join metoda toho ',' a ne toho
pole.

Tak nie som jedný, komu sa zdá, že to má Python opačne. :-)

já jsem stráášně rozmlsaný z Ruby kde všechno má svou logiku.  Po
nějaké chvíli člověk začne psát příkazy/metody intuitivně bez
konzultace s dokumentací a všechno funguje.

Každý má jiný pohled na věc a jiná očekávání. Podle mého názoru
je přístup typu ','.join(kontejner) možná na první pohled nezvyklý,
ale na druhý pohled je velmi logický. Jde o to, že dokáže spojit
zadaným řetězcem prvky dodané jakýmkoliv kontejnerem,
který podporuje iteraci a který vrací řetězcové prvky.
Souhlasím, mě osobně to přijde naprosto logické. Je to skutečně o úhlu 
pohledu a zvyklostech jazyka :-D


T.

___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python