Co mi vadí na Pythonu

Občas mě kamarád poprosí o pomoc se zapeklitým problémem, většinou v PHP. Přijdu, pomůžu vypátrat a nezapomenu zmínit, jak je PHP nelogické, nekonzistentní, plné WTF momentů a jak jsem rád, že jsem tento svět opustil. Dokonce jsem kamaráda nahlodal natolik, že si začal o Pythonu číst. Zajímalo ho ale taky, když mám tolik výtek k PHP, kolik a jaké výtky mám k Pythonu? To mě trochu zarazilo, nikdy jsem o tom nepřemýšlel. A na nic se mi nedařilo přijít. Nevzdal jsem se, vytvořil si prázdný texťák a postupem si zapisoval co se naskytlo. Výsledkem je následující seznam…
  • Výchozí parametr ve funkci/metodě se vyhodnotí jednou při kompilaci, nikoliv při volání. Tedy pak vzniká tento problém:
>>> def foo(l=[]):
...     l.append(42)
...     print l
... 
>>> foo()
[42]
>>> foo()
[42, 42]
  • Datový typ bool je ve skutečnosti také int. Při podmínkování na datový typ se nesmí zapomenout nejprve zjišťovat, zda se nejedná o bool a teprve potom o int. Tím to nekončí, jsou tu další zajímavé vedlejší účinky:
>>> isinstance(True, int)
True
>>> True + True
2
>>> {1: 'one', True: 'true'}
{1: 'true'}
  • Líbí se mi, že si lze pomoct závorkami zalomit text bez nutnosti použití ošklivých zpětných lomítek. Bohužel to s sebou přináší možnost vznik chyb, které se velmi těžko hledají…
>>> t = ('a', 'b' 'c')
>>> len(t)
2
>>> # Tohle je ale fajn.
>>> (
...     'some very long '
...     'sentence...'
... )
'some very long sentence...'
  • Také se mi líbí, že tuple lze zapsat bez nutnosti závorek (tím pak lze zapsat například for k, v in d.items()). Jen když se někde nechtěně objeví čárka nebo se naopak na ni zapomene…
>>> 2,
(2,)
>>> (2)
2
  • Je fajn, že se mohu vybrat svobodně mezi tabulátory a mezerami. Co už ale fajn není je, že mix je povolen. Když se pak otevře soubor na chvíli v jiném editoru a nevšimnu si špatného nastavení, Python mi nezahlásí SyntaxError.
  • Chápu důvod, proč se musí explicitně k metodám psát self. Ale, opravdu by to nešlo bez toho? Nejednou jsem zapomněl self napsat.
  • Relativní importy jsou skvělá věc, ale limituje to v použití názvů. Aneb naštve když mě konečně napadne skvělý název pro soubor s mojí super třídou a o chvilku později zjistím, že mi to koliduje s nějakou knihovnou, kterou používám. To lze tedy potlačit direktivou from __future__ import absolute_import nebo použitím Pythonu 3, takže už to není takový problém.
  • str a unicode. Kolik chyb tohoto problému jsem viděl! Kéž by všichni psali tak, aby byl všude unicode a převode na str jen naprosto v nutném případě. Naštěstí tohle řeší Python 3.
  • Naneštěstí použití Pythonu 3 není tak jednoduché. Nekompatibilita je nekompatibilita a tak ne všechny používané knihovny zmigrovaly. Což je u větších projektů dost limitující (vždycky se najde knihovna, kvůli které přejít nelze).

A to je vše, víc mě nenapadá. Celkově mám Python velmi rád. Možná proto, že je to rebel; kamarád mi řekl, že Python mění jeho svět programování. Jinde jsou totiž podobné zápisy vyhodnoceny jako syntax error. Aneb díky Pythonu se mohu soustředit více na problém, který řeším, a nepřemýšlet, jak něco napsat.

3 responses
První zmíněná vlastnost (tedy že výchozí parametr se vyhodnotí jednou při konstrukci funkce) se mi už mockrát hodila. Napří. když dynamicky vytvářím funkci > def a(param): > def b (p = param): > print p > return b > f = a(1) takže volání funkce f() vypíše přímo 1. Je to velice užitečná vlastnost. Kdyby se takhle python nechoval, tak by se to těžko jinak dosahovalo. Obrácného chování jde dosáhnout velice snadno přidáním jednoho řádku. Přidávání "self" na začátek každé funkce mi také vadilo, ale po letech s pythonem jsem přišel na to, že je díky tomu velice univerzální a přehledný. Vhod to přjde zejména v případě, že se dynamicky staví třídy nebo se jako methody používají libovolné externí funkce. A kromě toho to snad každý slušný editor doplňuje sám úplně automaticky a pogramátor se o to nemusí vůbec starat.
Konverze datových typů na bool v Pythonu je voodoo magie. V Pythonu 3x je to trochu přehlednější. Ale stejně konverze int na bool je imho strašná prasárna.
1 visitor upvoted this post.