Co mi vadí na Pythonu

cs v kategorii code • 5 min. čtení
Mind the age! Most likely, its content is outdated. Especially if it’s technical.

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.






2 reakce

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.





Může se vám také líbit

en Makefile with Python, November 6, 2017
en Fast JSON Schema for Python, October 1, 2018
en Deployment of Python Apps, August 15, 2018
cs Jasně, umím Git…, August 6, 2014
cs Checklist na zabezpečení webových aplikací, March 1, 2016

Další články z kategorie code.
Nenechte si ujít nové články díky Atom/RSS kanálu.



Poslední příspěvky

cs Mami, tati, přejde to, December 9, 2023 in family
cs Co vše bychom měli dělat s dětmi?, November 24, 2023 in family
cs O trávicí trubici, November 7, 2023 in family
cs Na šestinedělí se nevyspíš, October 28, 2023 in family
cs Copak to bude?, October 20, 2023 in family