Co mi vadí na Pythonu

cs in code • 5 min read

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.





You may also like



Popular from code