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