publikuj: Opublikuj w wykop.pl Opublikuj we flaker.pl Opublikuj na OSnews.pl Opublikuj w delicious wydrukuj
15 skomentuj »

TAGI: zen of python , python , programowanie , pep-8

2009-06-03 09:38  |  Jan Koprowski

Python: czytelność i nowoczesność przede wszystkim

Python: czytelność i nowoczesność przede wszystkim

Na Pythona można patrzeć z wielu różnych punktów widzenia. Rozpatrywać jego cechy pod kątem wydajności, zastosowania w tworzeniu skryptów, dokładności obliczeń numerycznych czy choćby dostępności bibliotek. Dziś spojrzymy na niego przede wszystkim jako na język programowania, który jest czytelny i nowoczesny.

Czytelność

To zadziwiające, jak wiele czynników wpływających na czytelność kodu wprowadzili do języka Python jego twórcy. Występują one na ogromnej liczbie płaszczyzn: teoretycznych standardów kodowania, zasad pisania komentarzy, robienia odstępów w kodzie czy składni języka (została nawet spisana filozofia przyświecająca Pythonowi). Przyjrzenie się im może budzić podziw. Wszystko – od stylu pisania kodu po choćby myślenie o Pythonie – ukierunkowane jest na czytelność. Zobaczmy z bliska, o co dokładnie chodzi.

 

Proste nazwy w języku angielskim

Jestem pod wrażeniem staranności, z którą zostały dobrane nazwy zmiennych, funkcji oraz słów kluczowych języka Python. Kod programu czyta się naprawdę jak książkę. Nie jest przy tym rozwlekły, nazwy nie są z reguły długie – ale równocześnie bardzo celnie i trafnie opisują działanie danej funkcji lub przeznaczenie i zawartość zmiennej.

Niewątpliwie brawa należą się twórcom języka, ale jest to nie mniej ważna informacja również dla nas – w celu tworzenia czytelnego kodu, który będzie dla nas zrozumiały za miesiąc, za pół roku, za rok – powinniśmy bardzo starannie dobierać nazwy zmiennych. Patrząc na dobrze napisany kod, będziemy mogli powiedzieć niczym Cypher z pierwszej części filmu Matrix: "[...] I don't even see the code. All I see is blonde, brunette, redhead. Hey, you a... want a drink?".

 

Obowiązkowe wcięcia

Wcięcia – osławione przez jednych i znienawidzone przez innych (przyrównujące tę konwencję do pomysłu z czasów języka FORTRAN). To z jednej strony najbardziej podstawowa a równocześnie genialna w swojej prostocie metoda na zwiększenie czytelności kodu. Python idzie dalej.

Po pierwsze, język ten wymusza stosowanie wcięć. To krok milowy w kierunku uczynienia kodu programu bardziej czytelnym. Co więcej, dzięki oznaczaniu kolejnych bloków instrukcji wcięciami można zredukować w składni liczbę ozdobników, takich jak klamerki, nawiasy czy średniki. Dzięki temu widzimy samą implementację kodu: nazwy funkcji i zmiennych, obiektów czy klas, a nie niewiele dla nas znaczące i raczej zaciemniające całokształt klamerki i nawiasy.

 

Standard kodowania: PEP-8

Na straży czytelności kodu stoi przede wszystkim PEP-8, czyli typowy standard kodowania. Został on stworzony dla osób programujących kod dla biblioteki podstawowej Pythona, ale jest również stosowany w wielu innych projektach na całym świecie. Oczywiście, większości tych zasad, można używać także w innych języka programowania.

Wcześniej spotkałem się tylko z Drupal Coding Standards oraz coding standards moich wykładowców. Jednak szczegółowość oraz zasięg reguł, które zostały zdefiniowane w przypadku Pythona, przerosła moje oczekiwania.

Gdyby ktoś potrzebował przyjrzeć się proponowanym przez Guido zasadom, dobry skrót można znaleźć na blogu Grzegorza Szymańskiego w serii wpisów zatytułowanych Moja ściąga z PEP-8. Niestety, nawet przytoczenie najważniejszych elementów przekracza ramy tego artykułu.

«poprzednia 1 2 3 4 następna »

publikuj: Opublikuj w wykop.pl Opublikuj we flaker.pl Opublikuj na OSnews.pl Opublikuj w delicious wydrukuj
15 skomentuj »

Komentarze

  • hipertracker

    #1 hipertracker® 2009-06-05 01:47:22 0

    Powinno być "funkcje anonimowe", a nie "funkcje nienazwane". Co do lambdy to jest ona bardzo słaba (może zawierać tylko jedno wyrażenie). Daleko jej nie tylko do lambdy dostępnej w językach funkcyjnych (np. Haskell), ale również do anonimowych funkcji choćby w JavaScript czy nowym PHP 5.3. Guido planował nawet wyrzucić lambdę z języka. Może Python kiedys doczeka się pełnych domknięć (closures), które np. ma Ruby.

    Metoda format dla obiektu str, to żadna rewolucja. Przecież
    '{ja} i {ty}'.format(ja='JA',ty='TY')
    można uzyskać "starą" metodą:
    '%(ja)s i %(ty)s' % dict(ja='Ja',ty='TY')
    . Nie wiem jak to ma się do Zen Pythona mówiącym o tym, że powinna istnieć "tylko jedna droga do celu". To samo dotyczy funkcji open() vs file(). Obie robią to samo. Gdyby chcieć się czepiać, ,można by jeszcze poszukać paru niespójnosci.

    Nie wiem skąd wziąłes te dwie spacje na wcięcie (tak zaleca się w Ruby, a nie w w Pythonie) To nie ma nic wspólnego z PEP-20. Za to jest sprzeczne z PEP-8, które zaleca 4 spacje na wcięcie.

    Czy Python jest językiem nowoczesnym? Zależy co jest miarą nowoczesnosci. Współczesny hardware wymaga aby język posiadał dobre wsparcie do pracy wieloprocesorowej. Python tego nie ma (z powodu GIL'a). Brak pełnych domknięć i słaba lambda powoduje, że już w tym wypadku bardziej nowoczesny jest Ruby czy JavaScript. Moim zdaniem rozwój języka jest powolny i Python zaczyna zostawać w tyle. Python 3000 nie wnosi praktycznie żadnych znaczących nowosci do języka. Python ma swoją pozycję, i... od lat jej nie zmienia. I chyba tak już zostanie.

    IP: 92.251.155.[...] Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; pl; rv:1.9.1b4) Gecko/20090423 Firefox/3.5b4

  • jankoprowski

    #2 Jan Koprowski® 2009-06-05 06:43:12 0

    1) Rozważają usunięcie z czasem składni "%"towej

    2) Dwie spacje - są tak samo dobre jak 3 czy 5 albo 4. To tylko przykład więc co za różnica.

    IP: 87.207.101.[...] Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.28 Safari/530.5

  • hipertracker

    #3 hipertracker® 2009-06-05 14:25:09 0

    Równie dobrze można użyć 13 spacji... Chodzi jednak o to, że PEP-20 w ogóle się nie wypowiada na te tematy (wbrew temu co napisano w artykule). A PEP-8 jasno stwierdza, że konwencją są 4 spacje. PEP-20 to tylko ogólny Zen of Python. Może miałeś na myśli jakiś inny PEP??

    IP: 193.95.179.[...] Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/528.18.1 (KHTML, like Gecko) Version/4.0 Safari/528.17

  • hipertracker

    #4 hipertracker® 2009-06-05 14:42:24 0

    Co do wcięć, to są one też w Haskellu. Generalnie jest to typowy feature z gatunlu "hate or love". Np. wcięcia nie sprawdzają się w szablonach, lub przy funkcjach anonimowych. Być może dlatego lambda jest taka prymitywna i nie obsługuje wiele wyrażeń.

    Składnia procentowa (sprintf) ma większe możliwości, więc dodanie tej nowej to jest krok w tył. Np. spróbuj w nowej składni sformatować dane:

    "[x=%(price)08.3f, y=%(msg)-10s]" % dict(price=12.3455678, msg='hello')

    # => '[x=0012.346, y=hello     ]'

    IP: 193.95.179.[...] Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/528.18.1 (KHTML, like Gecko) Version/4.0 Safari/528.17

  • Aspiryna
  • Aspiryna
  • Jacek Medyk
  • hipertracker

    #8 hipertracker® 2009-06-09 22:54:49 0

    Aspiryna: akurat czasem jest odwrotnie, w obiektywo wykorzystywanym JavaScripcie praktycznie wszystkie metody są implementowane z wykorzystaniem funkcji anonimowych. 

    Ogólnie, domknięcia czynią kod czytelniejszym i ładniejszym. Dzięki closures możliwe było np. zaimplementowanie RJS, szablonów do JS używanych w Rails. W Pythonie uzyskanie czegoś takiego jest po prostu niemożliwe.

    Jacuś Medyk: masz problemy z czytaniem ze zrozumieniem? Za trudny tekst, co?

    IP: 212.2.170.[...] Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; pl-pl) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Safari/530.17

  • Jacek Medyk

    #9 Jacek Medyk 2009-06-10 18:01:38 0

    Jaruś Zabiełło: Za trudny nie, tylko trochę nużący. Na okrągło wciskasz tą samą śpiewkę o wyższości gruszki nad pietruszką i nic sensownego z tego nie wynika. Ile języków zaprojektowałeś mądralo? Na rozwój ilu miałeś choć minimalny wpływ?

    IP: 83.10.176.[...] Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10

  • hipertracker

    #10 hipertracker® 2009-06-11 20:03:05 0

    Jacusiu Medyku: znowu piszesz nie na temat, trollu.

    IP: 78.16.112.[...] Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; pl-pl) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Safari/530.17

  • Fan Zabiełło

    #11 Fan Zabiełło 2009-06-11 22:38:40 0

    Idź lepiej zbierać marchewki na polu :)

    IP: 84.234.40.[...] Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10

  • me_

    #12 me_ 2009-08-06 10:51:27 0

    Przepraszam Panie @Jarosław Zabiełło, co to znaczy "pełnych domknięć"? bez problemu można implementować w Pythonie domknięcia (nawet na kilka sposobów, choć każdy wnosi coś innego) - jeśli dla Pana "pełene" znaczy zapisane w jednej linii to będę musiał Pana  niestety rozczarować.

    IP: 81.186.224.[...] Opera/9.80 (Windows NT 5.1; U; en) Presto/2.2.15 Version/10.00

  • Marek  Lewandowski

    #13 Marek Lewandowski 2010-05-06 18:50:02 0

    Wiem ze temat stary ale niedawno przeglądałem. Zdziwiły mnie komentarze Jarosława Zabiełło®. Zwłaszcza o metodzie format, że nie można jej używać analogicznie do metody procentowej. Nie uzywałem jeszcze tej metody ale poświeciłem te 15 minut, poszukałem i wyszło mi coś takiego:

    "".format(price=12.3455678, msg='hello')

    #''

    czy to nie wyglada podobnie do:

    "" % dict(price=12.3455678, msg='hello')

    # => ''

    Albo cos sie zmieniło od zeszłego roku, albo ja nie widze problemu.

    IP: 87.119.53.[...] Mozilla/5.0 (X11; U; Linux i686 (x86_64); pl-PL; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.0

  • Marek  Lewandowski

    #14 Marek Lewandowski 2010-05-06 18:53:08 0

    Wiem ze temat stary ale niedawno przeglądałem. Zdziwiły mnie komentarze Jarosława Zabiełło®. Zwłaszcza o metodzie format, że nie można jej używać analogicznie do metody procentowej. Nie uzywałem jeszcze tej metody ale poświeciłem te 15 minut, poszukałem i wyszło mi coś takiego:



    "[x={price:08.3f},y={msg:10s}]".format(price=12.3455678, msg='hello')

    #'[x=0012.346, y=hello     ]'
    czy to nie wyglada podobnie do:



    "[x=%(price)08.3f, y=%(msg)-10s]" % dict(price=12.3455678, msg='hello')

    # => '[x=0012.346, y=hello     ]'
    Albo cos sie zmieniło od zeszłego roku, albo ja nie widze problemu.

    IP: 87.119.53.[...] Mozilla/5.0 (X11; U; Linux i686 (x86_64); pl-PL; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTB7.0

  • demikaze

    #15 demikaze 2010-06-06 02:13:25 0

    O, widzę że Pan Zabiełło Exterminator znów zabija komentarze swoimi wpisami...

    IP: 62.141.223.[...] Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3

Uwaga! Możesz zarejestrować się w serwisie i w ten sposób zarezerwować swój nick oraz ominąć konieczność ciągłego odczytywania wyrazów.

Aby dodać komentarz, musisz podać swój nick, treść komentarza oraz poprawnie przepisać oba słowa z obrazka (słowa muszą być rozdzielone spacją).
W treści komentarza można używać języka formatowania BBcode.

Polecane książki

Czytaj Webhosting

Chcesz być na bieżąco z naszymi informacjami? Zapisz się na Newsletter.

Zarejestruj domenę

Sprawdź dostępność swojej domeny:

.pl: 0 zł   .com: 19.90 zł
.com.pl: 0 zł   .eu: 19.90 zł