[python] Buducnost Pythonu: lambda, map, filter

Petr Prikryl PrikrylP na skil.cz
Pátek Listopad 10 13:46:54 CET 2006


superman
> [...] Osobně lambda především omezuje zbytečné definice 
> krátkých funkcí, které se použijí jednorázově. To může 
> zpřehlednit maximálním způsobem zdrojový kód. Přepsat 
> se samozřejmě dá všechno, protože je matematicky dokázáno, 
> že jakýkoli algoritmus se dá napsat pouze s podmíněným skokem.

Jde o to, že Python může k reduce a lambda nabídnout 
alternativy, které nelze srovnávat s primitivností 
podmíněného skoku. Ty alternativy mi připadají lepší
než reduce/lambda.

> > Přiřazení jako výraz působí komplikace protože se 
> > v boolovských výrazech může poplést == s =.
> 
> To je bohužel problém Pythonu, že umožňuje do logických 
> operátorů zavést i jiné, než logické typy. Tohle v jazycích
> nesnáším, tahle vlastnost je "error prone" a bohužel jí hodně
> tvůrců jazyka z nějakého, pro mě sadistického důvodu zavádí.

Ten sadistický důvod se jmenuje zpětná kompatibilita. Začíná
to u strojových instrukcí, přes C, C++ a vše, co se je snaží
napodobovat. Strojové instrukce neznají typy ve smyslu
vyššího programovacího jazyka. Nula je false, cokoliv jiného
je true. Python kdysi boolovské hodnoty vůbec neznal.

> Tohle bohužel dobře ošetřila Java, nebo Pascal, že logické 
> operátory musejí mít jako operandy pouze logické typy. 
> Pak rozhodně není žádný problém s = a ==. Takže problém, který 
> popisujete je sekundární.

... ale ne v Pythonu. V něm můžu jakémukoliv jménu přiřadit 
cokoliv (referenci na libovolný objekt). Pascal a Java dělají
typovou kontrolu v době kompilace a identifikátor je svázán
s typem. V Pythonu by tedy docházelo k výrazně zapeklitějším 
chybám.

> Díky té blbosti, že logické výrazy pracují i s nelogickými typy je 
> Python závislý na kontextu. Tentýž výraz znamená něco jiného 
> v podmínce a něco jiného mimo podmínku. Nechápu proč prostě dovolovat 
> podmínky typu:
> 
> a = 2
> if a:
>    print "je to tam"
> 
> Já bych si přál jazyk, který striktně přikazuje napsat:
> 
> a = 2
> if a != 0:
>    print "je to tam"

Říká se tomu interpretace v boolovském kontextu. Je to věc
dohody. Taky píšu raději 
  if len(lst) > 0:
     ...
než jen
  if lst:
     ...

Ale hodně lidí dává přednost stručnosti... ;o)
a taky vyhození této vlastností by v porovnání s vyhozením
lambda bylo mnohem výraznější...

> [...] hrubé PORUŠENÍ ZPĚTNÉ KOMPATIBILITY jazyka, a pokud 
> vím, zatím žádný jazyk tohle nepřežil ve zdraví.

> [...]Já se nechci hádat o alternativním zápisu. Mě jsou 
> takovéto hádky ukradené. Prostě lambda, map, filter, 
> reduce tam v Pythonu již jsou a z toho vyplývá, že tam 
> mají zůstat. A nebo tam neměly nikdy být. Tyhle hádky 
> měly skutečný smysl v době návrhu jazyka, teď už jsou pasé.

Trochu mi to připomíná "Nic mi neříkejte! Já na to přijdu sám.".
Debata kolem návrhu odstranit lambda a spol byla tuhá. Pokud si
dobře pamatuji, implementace lambda je v jádře jazyka udělána
nějak nečistě a některé věci komplikuje. Asi komplikuje i další
vývoj. V novějších verzích Pythonu se objevily generátory 
a generátorové výrazy, které zpětně vyjasňují i konstrukce
s tak krkolomným názvem, jako je "list comprehension"
(generátor seznamu).

Odhaduji, že i po uvedení verze Python 3(000) bude 
Python 2.x dlouho podporován a opravován. Nic Vám nebrání 
zůstat u něj. Disky budou tak veliké, že souběžná instalace
obou verzí interpretu bude chápána jako nulový problém.
Nedivil bych se, kdyby Python 3000 vyřešil věc pragmaticky
tím, že Python 2.x by byl součástí instalace Python 3000
jen kvůli zaručení zpětné kompatibility.

> Teď to tam je, a pak by tam podle Zen of Miloslav Ponkrác:
> 
> 1) Budeš v maximální možné míře dodržovat zpětnou kompatibilitu

Spousta odborníků používajících C++ říká, že jednou z největších
chyb byla asi snaha být důsledně zpětně kompatibilní s C.

> 2) Jazyk, který kdy v historii hrubě porušil zpětnou 
> kompatibilitu vymřel.

Příklad?

pepr


Další informace o konferenci Python