Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Wcięcia w kodzie i konfiguracja edytorów

Wcięcia w kodzie źródłowym programów to temat często powracający m.in. w dyskusjach na temat konfiguracji edytorów, środowisk programistycznych (szczególnie gdy edytor ma służyć do obsługi plików napisanych w różnych językach programowania). Temat ten ma jeszcze większe znaczenie w przypadku języków, w których wcięcia wskazują strukturę programu, jak np. Python czy Haskell. Przestrzeganie właściwego stylu wcięć ma na celu nie tylko poprawienie czytelności kodu i zminimalizowanie "dekoracji" na rzecz właściwej treści, ale pociąga za sobą poważniejsze konsekwencje (xkcd) w postaci błędów podawanych przez interpreter.

O ile w przypadku Pythona sprawa jest dość prosta, to w zrozumienie koncepcji wcięć Haskella wymaga bardziej szczegółowej analizy.

Struktura kodu Pythona podzielona jest na bloki, wydzielone za pomocą wcięć. Dla programistów przyzwyczajonych do języków programowania, w których spacja nie ma znaczenia składniowego może to być na początku irytujące. Spotyka się nawet niepochlebne porównanie do sztywnego systemu kolumnowego stosowanego w czasach fortranowych kart perforowanych (1).

Dodatkowe zasady związane są z formatowaniem dokumentujących ciągów tekstowych (znajdujących się za wierszem def, ale jeszcze przed właściwym kodem funkcji). Dotyczą one języka znaczników reStructuredText. Stosowanie konwencji wcięć i struktury kodu Pythona z zastosowaniem składni reStructuredText umożliwa tworzenie świetnej dokumentacji przy pomocy generatora Sphinx.

Mark Summerfield - autor książki o programowaniu w Pythonie 3 pisze tak:

W przeciwnieństwie do większości innych języków programowania, do wskazania struktury bloku Python stosuje wcięcia. Niektórzy programiści nie lubią takiego rozwiązania, zwłaszcza jeśli wcześniej nie próbowali go stosować, i podchodzą do sprawy dość emocjonalnie. Jednak przywyknięcie do tego rozwiązania zabiera kilka dni, a po upływie kilku tygodni badź miesięcy kod pozbawiony nawiasów klamrowych wydaje się przyjemniejszy i łatwiejszy w odczycie niż kod stosujący takie nawiasy.

Patrz: Java.

W przypadku Pythona obowiązuje konwencja wcięć na szerokość 4 spacji. Edytory wspierające ten język dodatkowo ułatwiają pracę dbając o właściwe umiejscowienie kursora w nowej linii.

Google Python Style Guide zaleca:

- nigdy nie używać wcięć w postaci tabulatorów
- nie mieszać znaków tabulacji ze spacjami (TabsSpacesBoth)
- w przypadku ewentualnej kontynuacji w nowej linii zaleca wyrównanie elementów w poziomie lub wcięcie na 4 spacje w sytuacji, gdy elementy umieszamy w nowej linii:

A co na ten temat mówi sam twórca języka Python Guido van Rossum?

If it uses two-space indents, it's corporate code; if it uses four-space indents, it's open source. (If it uses tabs, I didn't write it! :-)
(2)

Bardziej skompilowana sytuacja występuje w przypadku funkcyjnego języka Haskell. Tu również wcięcia odgrywają dużą rolę, a czytelność kodu wynika z przyjętego stylu Literate Programing, który opisał twórca systemu TeX - Donald Knuth. Styl ten oparty jest na założeniu, że programy komputerowe powinny być pisane z naciskiem na czytelność kodu źródłowego dla ludzi, podobnie do dzieła literackiego (3).

Choć zasady stosowania wcięć, spacji i znaków tabulacji zostały precyzyjnie opisane w Good Haskell Style, są trudniejsze do zrealizowania, a ze względu na małą popularność tego języka, dostępność narzędzi jest ograniczona.

W ten sposób zebrane zostały (chyba) wszystkie zasady teoretyczne. A jak to wygląda w praktyce?

W praktyce wiele zależy od ustawień edytora. Środowisko programistyczne IDLE dostarczane do Pythona w wersji dla systemu Windows ma domyślnie ustawione wcięcie na 4 spacje i "rozbija" znaki tabulacji na spacje, dzięki temu kod otwarty w innym edytorze wygląda zawsze tak samo niezależnie od tego czy użytkownik ma w zdefiniowany odstęp tabulacji na szerokość 2, 4 czy 8 spacji.

W jaki sposób skonfigurować edytor, który nie przestrzega domyślnie wymienionych powyżej zasad dla języka Python?

Prześledźmy pliki konfiguracyjne trzech popularnych edytorów.

Emacs

Podstawowy plik konfiguracyjny init.el powinien zawierać następujące wpisy:

(setq-default indent-tabs-mode nil) (setq default-tab-width 4)

indent-tabs-mode przyjmuje wartość false (nil), szerokość tabulacji default-tab-width wynosi 4 spacje.

(g)Vim

Plik _vimrc znajdujący się zwykle w C:\Program Files\Vim powinien zawierać wpis

autocmd FileType python setlocal expandtab shiftwidth=4 softtabstop=4 autoindent smartindent smarttab nu

w którym expandtab odpowiada za "rozbicie" znaków tabulacji na spacje.

SciTE

W pliku SciTEGlobal.properties należy przypisać zmiennym następujące wartości:

# Indentation tabsize=4 indent.size=4 use.tabs=0

Na koniec lektura obowiązkowa:

- PEP 8 -- Style Guide for Python Code- PEP 257 -- Docstring Conventions

(1) Python - Struktura przez wcięcia
(2) All Things Pythonic
(3) Literate programming
 

Komentarze

0 nowych
Razi   5 #1 27.02.2011 17:34

A mi się podoba pythonowe podejście. Moim zdaniem dla początkujących to bardzo dobry wymóg, bo się przynajmniej wcięć nauczą stosować. Najgorsze co może być to 600 linii pascala bez wcięć.

G.Gn7Ex   5 #2 27.02.2011 20:47

@Razi
Ja natomiast miałem okazję widzieć kod w C/C++ z zagnieżdżonymi warunkami i pętlami, całkowicie bez wcięć. ;-]

iluzion   5 #3 27.02.2011 21:16

@Razi

Powyżej starałem się opisać zalety wcięć, najczęstsze problemy spotykane podczas pierwszego kontaktu z wymienionymi językami i ich rozwiązanie.

Osobiście też jestem zwolennikiem podejścia stosowanego przez Pythona.

G.Gn7Ex   5 #4 27.02.2011 21:33

Hmmm... może rzeczywiście powinienem zająć się Pythonem i ewentualnie coś "poskubać" w nim...?
No, ale jest to język interpretowany a o takich językach, a dokładniej o takich programach słyszałem, że są wolne, mało wydajne itp.

iluzion   5 #5 27.02.2011 22:21

Nie słuchaj;) Sprawdź sam. Wszystko zależy od przeznaczenia.

Ps Część popularnych bibliotek jest napisana w większości w C/C++, np. wxPython, NumPy, SciPy, PIL czy matplotlib.

  #6 27.02.2011 23:03

I oczywiście pyqt :)

TestamenT   11 #7 28.02.2011 00:57

Jeżeli coś w Pythonie działa wolno to można to przepisać do c\c++ ewentualnie użyć Cythona http://www.cython.org
A gdy ukończone zostaną pracę nad JIT dla CPython to w tedy dostanie większego przyśpieszenia. Albo można użyć PyPy implementacji Pythona napisanego w Pythonie który posiada już JIT ale niestety jest zgodny tylko z Pythonem 2.5.2

  #8 28.02.2011 08:02

Ja nie miałem jeszcze do czynienia z Pythonem, ale podoba mi się to "wymuszanie" wcięć. Pamiętam czasy gdy sam nie stosowałem wcięć i na uczelni wkurzałem się na wykładowcę od programowania, gdy przyczepiał się do każdej brakującej spacji (lub spacji za dużo), nawaisu klamrowego w nieodpowiednim miejscu i kazał poprawiać kod. Teraz doceniam tą jego upierdliwość bo widzę o ile czytejniejszy jest kod, gdy stosuję wcięcia. Gdy zdarza mi się rzucić okiem na mój stary kod bez wcięć to czasami potrzebuję godzinę na ogarnięcie tego co tam tworzyłem i popoprawianie wcięć.

  #9 28.02.2011 12:25

"Wymuszenie na programistach stosowania określonego schematu wcięć miało na celu ujednolicenie struktury programów i poprawienie ich czytelności. Z perspektywy czasu można uznać tę ideę za słuszną, gdyż programy napisane w języku Python słyną ze świetnej dokumentacji..."

A co mają wcięcia Pythona do jego świetnej dokumentacji?

iluzion   5 #10 28.02.2011 13:22

@demikaze

Niefortunny skrót myślowy. Dzięki. Poprawione.

Razi   5 #11 28.02.2011 19:49

Python jak na "interpretowany" jest bardzo szybki. Poza tym, na swój sposób też jest kompilowany :p

Kaelthas   2 #12 01.03.2011 18:39

"Styl ten oparty jest na założeniu, że programy komputerowe powinny być pisane z naciskiem na czytelność kodu źródłowego dla ludzi, podobnie do dzieła literackiego (3)."

Dla ucznia szkoły średniej przerabiającego wypociny humanistów to zdanie jest kpiną ;p. Gdyby programiści mieli pisać równie czytelnie jak twórcy romantyczni, czy barokowi to nadal byśmy byli na poziomie kart perforowanych.

iluzion   5 #13 01.03.2011 22:33

@Kaelthas

Dobre :)

fenixproductions   6 #14 02.03.2011 01:02

@Nietoperz75
O ile w Pythonie wcięcia są częścią języka, to o wymuszaniu ich w innych językach możnaby dłuo dyskutowac.
Osobiście uważam, że wymuszanie wcięć jest akurat głupim pomysłem bowiem każdy ma własne preferencje odnośnie stylu kodowania. Czytelnych styli są dziesiątki.

Jeden programista zapisze:

void function(int x, int y) {

a inny:

void function( int x, int y )
{

Który ze styli chcesz wymuszać? Używac spacji czy tabulacji?

Edytory kodu powinny po prostu pozwalać na przeformatowanie kodu bez zbędnych ceregieli wg definiowalnych szablonów (tutaj brawo dla Dreamweavera).

Ciekawym natomiast podejściem jest:
http://nickgravgaard.com/elastictabstops/

Niestety, nie do zastosowania w przypadku Pythona :(

iluzion   5 #15 02.03.2011 11:10

@fenixproductions

"Który ze styli chcesz wymuszać? Używac spacji czy tabulacji?

Edytory kodu powinny po prostu pozwalać na przeformatowanie kodu bez zbędnych ceregieli wg definiowalnych szablonów"

W Pythonie właśnie nie ma tego typu dylematów. Zasady są proste, edytor/IDE "prowadzi za rękę". Nie każdy musi lubić to podejście.

"Niestety, nie do zastosowania w przypadku Pythona :("

W zasadzie nie ma potrzeby korzystania z takiej opcji, ale zastosować się da. Najprostszy przykład:

http://i.imgur.com/fDc1Z.png