wtorek, 30 grudnia 2008

Bajzel w Pythonie

Uwielbiam Pythona!
Uwielbiam jego filozofię, łatwość i szybkość pisania kodu, przejrzystość kodu... (mógłbym wymianiać jeszcze długo)

Jest jednak rzecz, która ciągle nie daje mi spokoju - bajzel (oczywiście nie taki jak w PHP, ale jednak bajzel).

Spokojnie, już mówię dlaczego.

1. Funkcje wbudowane

from math import sqrt
print sqrt(4)
Ale:

print pow(2,2)
Dlaczego nagle nie muszę importować modułu math?!



2. Używanie funkcji zamiast metod

a = u'Hello World!'
print a.count('l')
Ale:

a = u'Hello World!'
print len(a)
Czemu obliczanie liczby wystąpień znaku wykonywane jest poprzez metodę obietku, a obliczanie długości stringa poprzez funkcję?!



3. Bałagan w nazewnictwie

a = raw_input('a: ')
print a
Ale:

a = 'Hello World!'
print a.isupper()
Dlaczego w części funkcji poszczególne słowa oddzielane są podkreślnikiem (_) a w innych nie?!



Miałem nadzieję, że wraz z przyjściem Pythona 3.0 (czy też Pythona 3000 - jak kto woli) te niekonsekwencje zostaną usunięte. Nie zostały. Może kiedyś w końcu ktoś zrobi z tym porządek!

Jeżeli będę "odnajdywał" kolejne takie kwiatki, będę je do tej listy dopisywał.

7 komentarzy:

  1. 1. pow () jest dostępne w globalnej przestrzeni nazw, bo jest dostępny globalnie operator ** (czyli potęgowanie), a który to operator jest cukrem syntaktycznym dla funkcji pow () :)

    2. gdzieś kiedyś było wyjaśnienie czemu len () jest funkcją (chyba chodziło o brak potrzeby implementowania w każdym obiekcie tej metody czy coś). Ale sam tego nie lubię ;)

    3. W Py3k nie ma już raw_input ;)

    Mi się bardziej nie podoba inna zmiana:
    {'a': 'b', 'c': 'd'} - stworzy słownik
    {'a', 's', 'd'} - stworzy set () (w Py3k)

    :)

    OdpowiedzUsuń
  2. 1. To niech sqrt będzie też dostępne globalnie. Albo wszystko, albo nic :)

    2. Ta metoda (__len__) i tak jest zaimplementowana w każdym obiekcie

    3. Chodziło o przykład jakiejkolwiek funkcji, w której wyrazy odzielone są _

    OdpowiedzUsuń
  3. 1. Żeby to miało sens, musiałby zostać dorobiony jakiś operator do math.sqrt () :)

    2. Nie jestem pewien czy takie uzasadnienie było - nie pamiętam teraz. Musiałbyś poszukać po PEPach.

    3. Daj przykłady ;) Ale takie ktore jeszcze w Py3k istnieją ;)

    OdpowiedzUsuń
  4. 1. No to w takim razie wywalamy oba :)

    2. Uzasadnienie nieważne, mogliby to "ładniej" rozwiązać.

    3. Nie mogę znaleźć przykładów, ale "Function names should be lowercase, with words separated by underscores" (PEP 8) więc powinno być is_upper, is_title itd.

    OdpowiedzUsuń
  5. 1. Bez sensu. Cały Python jest "zrobiony" tak, że wszelkiego rodzaju operatory etc są 'cukrem syntaktycznym' (syntactic sugar) na różnego rodzaju funkcje i metody. ** jest operatorem, takim jak +, -, / czy * - skoro chcesz wywalić jeden operator, to pozostałe wywalamy też, tak?

    2. Jak już mówiłem, też nie lubię len ().

    3. więc isupper () etc to zaszłość historyczna na którą nikt wcześniej nie zwrócił uwagi ;) mi nie przeszkadza :P

    OdpowiedzUsuń
  6. Więc może tak podstawowe moduły jak math, powinny być umieszczone w __builtin__ ? Chociaż zbliża to wtedy Pythona w stronę np. Ruby, który ma masę klas/funkcji w głównej przestrzeni nazw.

    OdpowiedzUsuń
  7. Jak więc widzisz, jest to po prostu jakiś konieczny kompromis, który ciężko jest w którąkolwiek stronę przeskoczyć... :)

    OdpowiedzUsuń