Dlaczego Python pep-8 zdecydowanie zaleca spacje nad tabulatorami do wcięć?

146

Widzę w Stack Overflow i PEP 8, że zaleceniem jest używanie spacji tylko do wcięć w programach Pythona. Rozumiem potrzebę konsekwentnego wcięcia i poczułem ten ból.

Czy istnieje jakiś podstawowy powód, dla którego należy preferować spacje? Myślałem, że praca z kartami jest znacznie łatwiejsza.

quamrana
źródło
7
Przeczytaj dyskusję dotyczącą PEP, aby wiedzieć.
e-satis
106
1 poziom wcięcia to ... 1. Uzgodnienie używania N spacji jest całkowicie nielogiczne, kiedy wszyscy mogliby używać jednej tabulacji. Co, nawiasem mówiąc, ma właśnie to zrobić. Akapit. Pewnego razu. 1 poziom wcięcia = 1 pojedynczy znak, czyli 1 pojedyncza tabulacja. Są też bardziej przydatne, ponieważ każdy programista może dowolnie wybierać sposób wizualizacji. Używanie spacji jest głupie, nigdy nie widziałem ani jednego argumentu, który nie byłby głupi.
o0 '.
31
@BlueBomber i dlaczego nie zmusisz ludzi do używania rozmiaru czcionki i schematu kolorów, który ci się podoba, gdy jesteś przy tym? Wciąż głupi.
o0 '.
10
@BlueBomber nie, nie, jest DOKŁADNIE na tym samym poziomie absurdu.
o0 '.
9
@BlueBomber Na czym dokładnie polega różnica? Zmniejszasz stopień swobody w konfiguracji środowiska innego programisty, nie osiągając żadnych zauważalnych korzyści. Jeśli chcesz być dyktatorem i zmusić wszystkich do spojrzenia na kod z wcięciem odpowiadającym 2, 4 lub 29 spacjom, nadal możesz to zrobić za pomocą tabulatorów. Po prostu poproś podwładnych o ustawienie IDE tak, aby wyświetlały tabulatory zgodnie z preferowaną liczbą spacji. Jeśli nie masz uprawnień, aby to zrobić, może powinieneś pozwolić im samodzielnie zdecydować, jak szeroka jednostka wcięcia jest wygodna dla ich oczu.
Asad Saeeduddin

Odpowiedzi:

111

Odpowiedź została udzielona bezpośrednio w PEP [red: ten fragment został zredagowany w 2013 r .]. Cytuję:

Najbardziej popularne sposobem wcięcia Python jest tylko przestrzeniach.

Jakiego innego podstawowego powodu potrzebujesz?

Mówiąc mniej wprost: rozważ także zakres PEP, jak określono w pierwszym akapicie:

Ten dokument zawiera konwencje kodowania dla kodu Pythona zawierającego bibliotekę standardową w głównej dystrybucji Pythona.

Celem jest utworzenie całego kodu, który trafia do oficjalnej dystrybucji Pythona konsekwentne sformatowanie (mam nadzieję, że możemy się zgodzić, że jest to uniwersalna Dobra Rzecz ™).

Ponieważ decyzja między spacjami i tabulatorami dla pojedynczego programisty jest a) naprawdę kwestią gustu ib) łatwo można ją rozwiązać za pomocą środków technicznych (edytory, skrypty konwersji itp.), Istnieje jasny sposób na zakończenie dyskusji: wybierz jedną .

Guido był tym, który wybrał. Nie musiał nawet podawać powodu, ale zrobił to, odwołując się do danych empirycznych.

Do wszystkich innych celów możesz przyjąć ten PEP jako zalecenie lub możesz go zignorować - Twój wybór, Twój zespół lub lider zespołu.

Ale jeśli mogę ci dać jedną radę: nie mieszaj ich ;-) [red: Mieszanie tabulatorów i spacji nie jest już opcją.]


źródło
11
Zgoda. Spójność jest ważniejsza niż tabulatory, spacje X i spacje Y.
Mike Clark
10
zastanawiam się ... dlaczego biblioteka standardowa ma tak wiele nazw metod mixedCase?
Kyle Wild
6
@dorkitude: a) nikt nie jest doskonały. b) przyczyny historyczne.
8
Dlaczego więc tak wielu programistów zdecydowało się używać spacji przed PEP-8? To jest to, co naprawdę chcę wiedzieć. Zalety zakładek wydają mi się oczywiste, ale nie spacje.
einnocenty
95

Cóż, wygląda na to, że wszyscy są mocno nastawieni na przestrzenie. Używam wyłącznie zakładek. Wiem dobrze, dlaczego.

Tabletki to tak naprawdę fajny wynalazek, który pojawił się później spacjach. Pozwala na wcięcie bez naciskania spacji miliony razy lub używania fałszywej zakładki (która tworzy spacje).

Naprawdę nie rozumiem, dlaczego wszyscy dyskryminują używanie zakładek. To bardzo przypomina starsze osoby, które dyskryminują młodszych ludzi za wybór nowszej, bardziej wydajnej technologii i narzekają, że wybieranie impulsowe działa na każdym telefonie , a nie tylko na tych nowych, wymyślnych. „Wybieranie tonowe nie działa na każdym telefonie, dlatego jest źle”.

Twój edytor nie obsługuje poprawnie zakładek? Cóż, kup nowoczesny edytor. To może być cholerny czas, jesteśmy teraz w XXI wieku, a czas, kiedy edytor był zaawansowanym technologicznie skomplikowanym oprogramowaniem, już dawno minął. Mamy teraz mnóstwo edytorów do wyboru, z których wszystkie dobrze obsługują zakładki. Możesz także określić, ile powinna być tabulator, czego nie można zrobić ze spacjami. Nie widzisz kart? Co to za argument? Cóż, nie możesz też zobaczyć spacji!

Czy mogę być tak odważny, aby zaproponować lepszy edytor? Jeden z tych zaawansowanych technologicznie, które ukazały się już jakieś 10 lat temu i które wyświetlają niewidzialne postacie ? (wyłącz sarkazm)

Używanie spacji powoduje znacznie więcej pracy przy usuwaniu i formatowaniu. Dlatego (i wszystkie inne osoby, które o tym wiedzą i się ze mną zgadzają) używają zakładek w Pythonie.

Mieszanie tabulatorów i spacji to nie-nie i żaden argument na ten temat. To jest bałagan i nigdy nie zadziała.

nigratruo
źródło
26
Aby to dodać, spójrz na klawiaturę, symbol klawisza TAB wyraźnie przedstawia wcięcie - jest to wcięcie klawisza, a nie spacja. PEP8 zaleca użycie spacji to błąd IMHO, ale to tylko zalecenie - en.wikipedia.org/wiki/Tab_character#Tab_characters
Daniel Sokolowski
29
Całkowicie zgadzam się z tym postem. Używanie spacji jest dla głupców, którzy lubią potykać się o te 1 spację bez błędów wcięć. Jeśli wcięcie było zmniejszone o jedną kartę, gwarantuję, że to zauważysz.
Sepero
12
@Zingham Nikt nie może używać wyłącznie tabulatorów: tabulatory i spacje są zawsze używane w połączeniu, co prowadzi do niespójności. Ja i tysiące innych używam ich dość konsekwentnie każdego dnia. Tabulatory do wcięć, spacje do wyrównania. Która dokładnie część tej koncepcji jest dla ciebie tak strasznie trudna do uchwycenia i dlaczego jesteś przekonany, że nie da się jej konsekwentnie stosować?
antred
1
Rzeczywisty problem z tabulatorami polega na tym, że nie można uzyskać dokładnego wcięcia znaku zalecanego przez ten sam PEP8 pod komentarzem „# Wyrównane z ogranicznikiem otwierającym”. Tylko to jest powód, dla którego preferujemy spacje: aby uzyskać prawidłowe wcięcie!
user541905
2
Pytanie brzmi: "Dlaczego Python pep-8 zdecydowanie zaleca spacje nad tabulatorami do wcięć?" . Ta odpowiedź nigdy nie wspomina o PEP8. ||| Zamiast próbować odpowiedzieć na pytanie ... ta odpowiedź wydaje mi się jednym wielkim, protekcjonalnym, przede wszystkim opiniotwórczym . Istnieje 276 słów, które mówią „tabulatory są lepsze niż spacje, a oto dlaczego ...”.
Trevor Boyd Smith
43

Osobiście nie zgadzam się ze spacjami nad tabulatorami. Dla mnie tabulatory są znakiem / mechanizmem układu dokumentu, podczas gdy spacje są dla treści lub rozgraniczenia między poleceniami w przypadku kodu.

Muszę zgodzić się z komentarzami Jima, że ​​tak naprawdę nie chodzi o karty, tylko o ludzi i to, jak chcą mieszać tabulatory i spacje.

To powiedziawszy, zmusiłem się do wykorzystania przestrzeni ze względu na konwencję. Cenię konsekwencję ponad osobiste preferencje.

Soviut
źródło
3
Próbowałem też zmusić się do używania spacji, ale edytor (przynajmniej Eclipse + PyDev) wygrywa mądre zakładki, szczególnie jeśli włączysz wyświetlanie niewidzialnych postaci. I mogę łatwo wizualnie ustawić tabulatory na 4, 8, 6 spacji. Tak więc w moim kodzie przynajmniej cenię osobiste preferencje i trzymam się spacji, jeśli jest to ustalona konwencja w istniejącej bazie kodu.
Daniel Sokolowski
2
To jest w porządku, o ile nie programujesz w zespole. Kiedy jesteś w zespole, zgadzasz się na jedną konwencję i trzymasz się jej.
Soviut
1
@Soviut Wydaje mi się, że to głównie pobożne życzenia. We wszystkich zespołach, w których kiedykolwiek byłem, oficjalną linią partii było „wykorzystanie przestrzeni”. W rzeczywistości praktycznie każdy plik był kompletnym bałaganem zarówno tabulatorów, jak i spacji, a nawet w plikach, które konsekwentnie używały tylko spacji lub tylko tabulatorów, wcięcia wciąż były wszędzie.
antred
Tak, ale o to mi chodziło. W końcu osiąga się i egzekwuje pewien konsensus. Jak powiedziałeś, zwykle jest to „po prostu użyj spacji”.
Soviut
to jest główny powód, dla którego wolę karty. Po prostu warto mieć oddzielne znaki dla układu i rozgraniczenia słów
woojoo666
31

Powodem spacji jest to, że tabulatory są opcjonalne. Spacje to rzeczywisty najmniejszy wspólny mianownik w interpunkcji.

Każdy przyzwoity edytor tekstu ma "zamień tabulatory na spacje" i wiele osób z tego korzysta. Ale nie zawsze.

Chociaż niektóre edytory tekstu mogą zastąpić kilka spacji tabulatorem, jest to naprawdę rzadkie.

Podsumowanie . Nie możesz się pomylić ze spacjami. Państwo może pomylić z zakładkami. Dlatego nie używaj zakładek i zmniejsz ryzyko błędów.

S.Lott
źródło
15
Nigdy nie ślubowałbym, że zrobię coś źle tylko dlatego, że wielu innym (ludzie, redaktorzy tekstów itp.) Również robią to w niewłaściwy sposób. W 2015 roku edytor tekstu, który nie obsługuje dobrze kart, należy do kosza.
antred
2
„Spacje nie mogą się pomylić. Możesz pomylić się z tabulatorami”. Zauważyłem, że jest to w 100% niepoprawne. Z mojego doświadczenia: „Nie można pomylić się z Tabulatorem. Spacje mogą się nie udać” ... zwłaszcza podczas udostępniania kodu.
cmroanirgo
5
Ktoś w końcu powiedział: użyj spacji, ponieważ jest to najniższy wspólny mianownik. Ta sama zasada zmusiła nas do zatrzymania MBR, BIOS i formularzy papierowych w urzędach rządowych. Tyle że te faktycznie mają problemy koncepcyjne, podczas gdy tabulatory a spacje to w 100% głupi problem użytkownika.
Milind R
1
Wydaje mi się to argumentem ad populum: błędnym argumentem, który prowadzi do wniosku, że zdanie jest prawdziwe, ponieważ wielu lub większość ludzi w nie wierzy. Ponieważ każdy redaktor może zastąpić tabulatory spacjami, spacje są właściwym wyborem jest błędem !!
Djunzu
28

Problem z zakładkami polega na tym, że są one niewidoczne, a ludzie nigdy nie mogą się zgodzić co do szerokości zakładek. Kiedy mieszasz tabulatory i spacje i ustawiasz tabulatory na coś innego niż Python (który używa tabulatorów co 8 spacji), zobaczysz kod w innym układzie niż widzi go Python. A ponieważ układ określa bloki, zobaczysz inną logikę. Prowadzi do subtelnych błędów.

Jeśli nalegasz na przeciwstawienie się PEP 8 i używanie tabulatorów - lub, co gorsza, mieszanie tabulatorów i spacji - przynajmniej zawsze uruchamiaj Pythona z argumentem „-tt”, co powoduje niespójne wcięcie (czasami tabulator, czasem spacja na to samo wcięcie poziom) błąd. Ponadto, jeśli to możliwe, ustaw edytor tak, aby wyświetlał karty w inny sposób. Ale tak naprawdę najlepszym podejściem jest nie używanie kart, kropka.

Thomas Wouters
źródło
43
To prawda, że ​​zakładki są niewidoczne i ludzie nie mogą się zgodzić co do ich szerokości. Ale to samo dotyczy przestrzeni. Kiedy mieszasz tabulatory i spacje, coś idzie nie tak. Ale dlaczego obwiniasz tę sytuację za pomocą zakładek, a nie spacji?
Jim
47
Nie, to samo nie dotyczy spacji. Ludzie mogą uzgodnić szerokość przestrzeni.
Rafał Dowgird
32
Pojedyncza spacja może zawsze mieć tę samą szerokość, ale wcięcia ze spacjami nie zawsze mają tę samą szerokość. Nie widzę, jak zgoda na używanie tabulatorów o szerokości n spacji różni się od zgody na wcięcie n spacjami.
Jim
26
Tak, wiem, jakie problemy może powodować połączenie tych dwóch elementów. Nie rozumiem, dlaczego niektórzy ludzie obwiniają o to karty. Problemem jest ich mieszanie, a nie tabletki w szczególności. Możesz rozwiązać problem, zastępując tabulatory spacjami, ale możesz również rozwiązać problem, zastępując spacje tabulatorami.
Jim
70
I nie, jeśli używam zakładek o szerokości 8, a ty korzystasz z zakładek o szerokości 6, a my udostępniamy kod, nie jest to pomieszane. To tylko jedna karta do interpretera Pythona.
Jim
22

Główne problemy z wcięciami występują podczas mieszania tabulatorów i spacji. Oczywiście to nie mówi ci, który powinieneś wybrać, ale jest to dobry powód, aby go polecić, nawet jeśli wybierzesz go rzucając monetą.

Jednak IMHO istnieje kilka pomniejszych powodów, dla których warto faworyzować spacje nad tabulatorami:

  • Różne narzędzia. Czasami kod jest wyświetlany poza edytorem programisty. Na przykład. opublikowane na grupie dyskusyjnej lub forum. Spacje generalnie radzą sobie lepiej niż tabulatory - wszędzie tam, gdzie spacje uległyby zniekształceniu, tabulatory również, ale nie odwrotnie.

  • Programiści inaczej widzą źródło. Jest to głęboko subiektywne - albo jest to główna zaleta zakładek, albo powód, aby ich unikać, w zależności od tego, po której stronie jesteś. Z drugiej strony programiści mogą wyświetlać źródło z preferowanym wcięciem, więc programista preferujący wcięcie z 2 spacjami może współpracować z programistą z 8 miejscami na tym samym źródle i nadal widzieć je tak, jak im się podoba. Wadą jest to, że ma to swoje konsekwencje - niektórzy ludzie lubią 8-spacje, ponieważ daje to bardzo widoczną informację zwrotną, że są zbyt głęboko zagnieżdżone - mogą zobaczyć kod sprawdzany przez 2-wgłębnik stale zawijany w edytorze. Fakt, że każdy programista widzi kod w ten sam sposób, prowadzi do większej spójności długości linii, a także do innych spraw.

  • Ciągłe wcięcie wiersza. Czasami chcesz wciąć linię, aby wskazać, że jest przenoszona z poprzedniej. na przykład.

    def foo():
        x = some_function_with_lots_of_args(foo, bar, baz,
                                            xyzzy, blah)

    Jeśli używasz tabulatorów, nie ma możliwości wyrównywania tego dla osób używających różnych tabulatorów w swoim edytorze bez mieszania spacji i tabulatorów. To skutecznie zabija powyższą korzyść.

Jest to oczywiście głęboko religijny problem, z którym nękane jest programowanie. Najważniejszą kwestią jest to, że powinniśmy wybrać jeden - nawet jeśli nie ten, który preferujesz. Czasami myślę, że największą zaletą znacznych wgłębień jest to, że przynajmniej oszczędzono nam płomieni podczas umieszczania zamków.

Warto również odczyt jest ten artykuł Jamie Zawinski w tej sprawie.

Brian
źródło
3
Jednak wyrównanie jest trywialne. Po prostu używam nawiasów jak blok i wcinam każdy argument. Ponadto w twoim przykładzie bardzo dobrze możesz używać spacji, ponieważ jesteś wewnątrz listy argumentów i możesz ułożyć dowolną liczbę spacji.
Soviut
3
@Soviut: Jeśli wcinasz spacje, wyrównanie jest pomieszane, gdy tylko zostanie wyświetlone z innym rozmiarem tabulacji. Jedynym sposobem, aby to zachować, jest użycie tabulatorów do poziomu wcięć, a następnie spacji dla reszty - tj. Zmieszanie spacji i tabulatorów, co prowadzi do własnych problemów.
Brian
Tak, dlatego i tak staram się po prostu używać konwencji Pythona polegającej na blokowaniu wcięć w moich argumentach. Oczywiście, mogą nie zgadzać się z nawiasem klamrowym, ale nadal jest jasne, do której linii lub polecenia należą. Składnia JQuery działa na podobnej zasadzie.
Soviut
2
@Brian: Nie rozumiem, jak to prowadzi do jakichkolwiek problemów. To jest właściwy sposób, tabulatory do wcięć, spacje do wyrównania. To nie to samo, co mieszanie spacji i tabulatorów dla wcięć .
antred
1
@CoreDumpError Uh nie, na pewno nie. Wiem o tym, ponieważ Python 3 nigdy nie narzeka na żaden z moich skryptów i używam tabulatorów do wcięć / spacji, aby wyrównać przez cały cholerny czas. Poza tym PEP8 nie może niczego „zabraniać”, ponieważ jest to jedynie zalecenie (i moim zdaniem zaciekawione).
antred
12

Zwróć uwagę, że używanie zakładek myli inny aspekt PEP 8:

Ogranicz wszystkie wiersze do maksymalnie 79 znaków.

Załóżmy hipotetycznie, że używasz tabulatora o szerokości 2, a ja używam tabulatora o szerokości 8. Piszesz cały kod tak, aby najdłuższe linie miały 79 znaków, a potem zaczynam pracować nad twoim plikiem. Teraz mam trudny do odczytania kod, ponieważ (jak stwierdza PEP):

Domyślne zawijanie w większości narzędzi zakłóca wizualną strukturę kodu

Jeśli wszyscy używamy 4 spacji, ZAWSZE jest tak samo. Każdy, kogo edytor obsługuje szerokość 80 znaków, może wygodnie odczytać kod. Uwaga: limit 80 znaków jest sam w sobie świętą wojną, więc nie zaczynajmy tego tutaj.

Każdy niepoważny edytor powinien mieć możliwość używania spacji tak, jakby były tabulacjami (zarówno wstawiającymi, jak i usuwającymi), więc to naprawdę nie powinno być prawidłowym argumentem.

Thane Brimhall
źródło
7

Odpowiedź na pytanie brzmi: PEP-8 chce udzielić rekomendacji i zdecydował, że skoro spacje są bardziej popularne, zdecydowanie zaleci spacje nad tabulatorami.


Uwagi dotyczące PEP-8

PEP-8 mówi: „Użyj 4 spacji na poziom wcięcia”.
Jest jasne, że jest to standardowe zalecenie.

„W przypadku naprawdę starego kodu, którego nie chcesz zepsuć, możesz nadal używać tabulatorów z 8 spacjami”.
Oczywiste jest, że istnieją NIEKTÓRE okoliczności, w których można używać zakładek.

„Nigdy nie mieszaj tabulatorów i spacji”.
To wyraźny zakaz mieszania - myślę, że wszyscy się z tym zgadzamy. Python może to wykryć i często się dusi. Użycie argumentu -tt powoduje, że jest to jawny błąd.

„Najpopularniejszym sposobem tworzenia wcięć w Pythonie są tylko spacje. Drugim najpopularniejszym sposobem są tylko zakładki ”.
To wyraźnie stwierdza, że ​​oba są używane. Dla jasności: nadal nigdy nie należy mieszać spacji i tabulatorów w tym samym pliku.

„W przypadku nowych projektów zdecydowanie zaleca się umieszczanie samych spacji nad tabulatorami”.
To wyraźne zalecenie i mocne, ale nie zakaz używania tabletek.


Nie mogę znaleźć dobrej odpowiedzi na własne pytanie w PEP-8. Używam zakładek, których wcześniej używałem w innych językach. Python akceptuje źródła z wyłącznym użyciem zakładek. To mi wystarczy.

Pomyślałem, że spróbuję pracować z przestrzeniami. W moim edytorze skonfigurowałem typ pliku tak, aby używał wyłącznie spacji, więc wstawia 4 spacje po naciśnięciu klawisza Tab. Jeśli naciskam tabulację zbyt wiele razy, muszę usunąć spacje! Arrgh! Cztery razy więcej usunięć niż zakładek! Mój redaktor nie może powiedzieć, że używam 4 spacji dla wcięć (chociaż edytor AN może to zrobić) i oczywiście nalega na usuwanie spacji pojedynczo.

Czy nie można powiedzieć Pythonowi, aby rozważał tabulatory jako n spacji, gdy jego wcięcia odczytu? Gdybyśmy mogli uzgodnić 4 spacje na wcięcie i 4 spacje na tabulator i pozwolić Pythonowi to zaakceptować, nie byłoby problemów.
Powinniśmy znaleźć rozwiązania problemów korzystne dla wszystkich.

quamrana
źródło
1
Jakiego edytora używasz? Większość, z których korzystałem, ma opcję dedentowania na backspace (na przykład emacs zachowuje się w ten sposób), niezależnie od implementacji wcięć.
Brian
Masz rację - nie widzę opcji dedukcji na backspace, ale prawdopodobnie możesz sobie z tym poradzić za pomocą shift-tab lub zmniejszyć wcięcie (domyślnie ctrl-shift-i).
Brian
Po prostu wypróbowuję PyScripter, który wydaje się być lepszy w używaniu spacji po naciśnięciu klawisza Tab i usuwaniu ich w 4 po naciśnięciu klawisza Backspace.
quamrana
28
„Muszę usunąć spacje! Arrgh! Cztery razy więcej usunięć niż tabulatorów!” - To jest jedyny powód, dla którego używam tabulatorów do wszystkiego i uważam, że ludzie używający spacji są szaleni. :) Nigdy nie miałem problemów, z wyjątkiem sytuacji, gdy wklejam coś z sieci, która używa spacji. Wtedy proste polecenie znajdź-zamień rozwiązuje ten problem.
Aphex
3

Zawsze używałem zakładek w moim kodzie. To powiedziawszy, niedawno znalazłem powód, aby używać spacji: podczas programowania na moim tablecie internetowym Nokia N900 miałem teraz klawiaturę bez klawisza Tab. To zmusiło mnie do skopiowania i wklejenia zakładek lub ponownego napisania kodu ze spacjami. Mam ten sam problem z innymi telefonami. To prawda, że ​​nie jest to standardowe użycie Pythona, ale należy o tym pamiętać.

Skyler
źródło
2

JWZ mówi to najlepiej :

Kiedy [ludzie] czytają kod i kiedy skończą pisać nowy kod, obchodzi ich, ile kolumn ekranu, według których kod ma tendencję do wcięcia, gdy otwiera się nowy zakres (lub sexpr, czy cokolwiek innego) ...

... Moim zdaniem najlepszym sposobem rozwiązania problemów technicznych jest nakazanie, aby znak TAB ASCII # 9 nigdy nie pojawiał się w plikach dyskowych: zaprogramuj swój edytor tak, aby rozszerzał TAB-y do odpowiedniej liczby spacji przed zapisaniem wierszy na dysku. ..

... Zakłada się, że nigdy nie używasz tabulatorów w miejscach, w których są one rzeczywiście istotne, np. W stałych łańcuchowych lub znakowych, ale nigdy tego nie robię: kiedy ma znaczenie, że jest to tabulator, zawsze zamiast tego używam '\ t'.

Mark Cidade
źródło
10
Zrobiłbym odwrotnie: tabulatory mają znaczenie semantyczne dla wcięć, więc bardziej sensowne jest przechowywanie tabulatorów i wyświetlanie spacji. Użytkownik mógł wybrać styl formatowania, a edytor odpowiednio rozwinąłby zakładki.
AkiRoss,
1
Nadal masz problem z mieszanymi tabulatorami i spacjami, a także jednym autorem używającym 1 kolumny na tabulator i wcięciem 4+ razy, co wyglądałoby szalenie w edytorze tekstu ustawionym na wyświetlanie każdego znaku tabulatora jako szerokości 4 kolumn. Tabulatory do wcięć mają największy sens w edytorze tekstu o zmiennej szerokości, takim jak edytor tekstu używający proporcjonalnych czcionek. Nie tak bardzo z edytorem tekstu o stałej szerokości.
Mark Cidade
2
Nie, miałem na myśli, że edytor tekstu powinien być w stanie przeanalizować gramatykę języka i zrozumieć, kiedy występuje tabulacja, tak aby tabulatory mogły być używane jako jedyna metoda formatowania i nie byłoby potrzeby używania spacji do wcięć. „Tab” nie musi mieć stałej szerokości i ogólnie uważam za wstyd, że przy dzisiejszych technikach (np. uczeniu maszynowym) formatowanie nadal stanowi problem dla programistów. Wszystko powinno być zautomatyzowane, zautomatyzowane i przejrzyste.
AkiRoss
Nie rozumiem, jak mógłby to zrozumieć.
Mark Cidade
1

Ponieważ Python polega na wcięciach w celu rozpoznania struktury programu, wymagany jest jasny sposób identyfikacji. To jest powód, dla którego wybieramy spacje lub tabulatory.

Jednak Python ma również silną filozofię, aby robić rzeczy tylko w jeden sposób, dlatego powinno istnieć oficjalne zalecenie dotyczące jednego sposobu wykonywania wcięć.

Zarówno spacje, jak i tabulatory stanowią wyjątkowe wyzwanie dla edytora, który może obsługiwać jako wcięcia. Obsługa samych zakładek nie jest jednakowa dla wszystkich edytorów, a nawet ustawień użytkownika. Ponieważ przestrzenie nie są konfigurowalne, stanowią bardziej logiczny wybór, ponieważ gwarantują, że wynik będzie wyglądał wszędzie tak samo.

Florian Bösch
źródło
8
A ponieważ każdy redaktor może również wybrać schemat kolorów, czy myślisz, że powinien on również ustalić, jakiego schematu kolorów użyć?
o0 '.
8
Tak, ale czy ta niekonsekwencja nie ma większego sensu? Ponieważ jest to po prostu kwestia preferencji wizualnych. Jeśli wolę większe "wyglądające" wcięcie w moim edytorze, mogę ustawić moje zakładki na 8 spacji, jeśli wolę mniej, mogę ustawić to na 2. W ten sposób kod, bez faktycznej zmiany formatowania, lepiej pasuje do osoby, która jest obserwując to.
dennmat
8
Zgadzam się z dennmat- Jeśli wizualnie wolę 2 spacje, a Guido wizualnie preferuje 4 spacje, to logicznym wyborem jest użycie wcięcia tabulatora.
Sepero
0

Najbardziej znaczącą zaletą, jaką mogę powiedzieć o spacjach nad tabulatorami, jest to, że wielu programistów i projektów używa określonej liczby kolumn dla kodu źródłowego, a jeśli ktoś zatwierdzi zmianę z tabulatorem ustawionym na 2 spacje, a projekt wykorzystuje 4 spacje jako tabstop długie linie będą zbyt długie dla okna edytora innych osób. Zgadzam się, że praca z kartami jest łatwiejsza, ale myślę, że spacje są łatwiejsze do współpracy, co jest ważne w przypadku dużego projektu open source, takiego jak Python.

sirwart
źródło
2
to jest złe: dzieje się tak tylko wtedy, gdy pomieszasz tabulatory i spacje, i równie dobrze rozwiązałeś to, zmuszając wszystkich do używania tabulatorów zamiast spacji.
o0 '.
0

Możesz wziąć ciasto i zjeść. Skonfiguruj edytor tak, aby automatycznie rozwijał karty w spacje.

(To byłoby :set expandtabw Vimie.)

Rod Daunoravicius
źródło
0

Domyślam się, że większość edytorów tekstu dla Linuksa sprawia, że ​​ustawienia domyślne wyglądają na absurdalnie duże. Nie przychodzi mi do głowy żaden inny dobry powód, aby używać spacji nad tabulatorami.

brian cronrath
źródło
-1

Poza wszystkimi innymi już wymienionymi powodami (spójność, nigdy nie mieszanie spacji i tabulatorów itp.) Uważam, że jest jeszcze kilka powodów, dla których należy zwrócić uwagę na konwencję 4 spacji. Dotyczy to tylko Pythona (i być może innych języków, w których wcięcia mają znaczenie). Zakładki mogą być ładniejsze w innych językach, w zależności od indywidualnych preferencji.

  1. Jeśli edytor nie pokazuje zakładek (co zdarza się, w zależności od konfiguracji, w kilku), inny autor może założyć, że twój kod używa 4 spacji, b / c prawie cały kod Pythona, który jest publicznie dostępny, robi; jeśli ten sam edytor ma szerokość tabulatora 4, mogą się wydarzyć nieprzyjemne rzeczy - przynajmniej ta biedna osoba straci czas na problem z wcięciami, którego bardzo łatwo byłoby uniknąć, trzymając się konwencji. Dlatego dla mnie najważniejszym powodem jest konsekwentne unikanie błędów.

  2. Zastanawiając się, co jest lepsze, tabulatory czy spacje, należałoby zapytać, jakie są zalety tabulatorów; Widziałem wiele postów wychwalających tabulatory, ale kilka przekonujących argumentów za nimi; dobre edytory, takie jak emacs, vi (m), kate, ... wykonują odpowiednie wcięcia w zależności od semantyki twojego kodu - nawet bez tabulatorów; te same edytory można łatwo skonfigurować tak, aby cofały wcięcia w backspace itp.

  3. Niektórzy ludzie mają bardzo silne preferencje, jeśli chodzi o ich swobodę w decydowaniu o wyglądzie / układzie kodu; inni cenią konsekwencję ponad tę wolność. Python drastycznie ogranicza tę swobodę, nakazując użycie wcięć dla bloków itp. Może to być postrzegane jako błąd lub funkcja, ale w pewnym sensie pojawia się przy wyborze Pythona. Osobiście podoba mi się ta spójność - zaczynając kodować w nowym projekcie, przynajmniej układ jest zbliżony do tego, do czego jestem przyzwyczajony, więc jest dość łatwy do odczytania. Prawie zawsze.

  4. Używanie spacji do wcięć pozwala na „sztuczki układu”, które mogą ułatwić zrozumienie kodu; niektóre ich przykłady są wymienione w PEP8; na przykład.

    foo = long_function_name(var_one, var_two,
                             var_three, var_four)
    
    # the same for lists
    a_long_list = [1,
                   2,
                   # ...
                   79]
    
    # or dictionaries
    a_dict = {"a_key": "a_value",
              "another_key": "another_value"}

    Oczywiście powyższe można też ładnie zapisać jako

    foo = long_function_name(
        var_one, var_two,
        var_three, var_four)
    
    # the same for lists
    a_long_list = [
        1,
        2,
        # ...
        79]
    
    # or dictionaries
    a_dict = {
        "a_key": "a_value",
        "another_key": "another_value"}

    Jednak ta ostatnia zajmuje więcej linii kodu, a mniej wierszy jest czasami uważanych za lepsze (b / c dostajesz więcej na jednym ekranie). Ale jeśli lubisz wyrównywanie, spacje (najlepiej wspomagane przez dobrego edytora) dają w pewnym sensie większą swobodę w Pythonie niż tabulatory. [Cóż, wydaje mi się, że niektórzy redaktorzy pozwalają zrobić to samo z tabulatorami;) - ale ze spacjami, wszystkie z nich robią ...]

  5. Wracając do tego samego argumentu, który robią wszyscy inni - PEP 8 dyktuje (ok, zdecydowanie zaleca) spacje. Jeśli przychodzisz do projektu, który używa tylko zakładek, oczywiście nie masz wielkiego wyboru. Jednak ze względu na ustanowienie konwencji PEP 8 prawie wszyscy programiści Pythona są przyzwyczajeni do tego stylu. To sprawia, że ​​o wiele łatwiej jest znaleźć konsensus w sprawie stylu akceptowanego przez większość programistów ... a uzyskanie zgody poszczególnych osób na styl może być bardzo trudne.

  6. Narzędzia, które pomagają egzekwować styl, są zazwyczaj świadome istnienia PEP 8 bez dodatkowego wysiłku. To nie jest dobry powód, ale fajnie jest mieć wszystko po wyjęciu z pudełka.

Gerald Senarclens de Grancy
źródło
-3

Uniwersalnym problemem związanym z zakładkami jest to, że mogą być one inaczej reprezentowane w różnych środowiskach.
W danym edytorze tabulator może mieć 8 spacji lub 2.
W niektórych edytorach możesz to kontrolować, w innych nie.

Innym problemem związanym z kartami jest sposób ich reprezentacji na wydruku. Uważam, że większość drukarek interpretuje tabulator jako 8 spacji.

W przypadku spacji nie ma wątpliwości. Wszystko ułoży się zgodnie z zamierzeniami autora.

Benoit
źródło
14
Kolejny, który zasadniczo źle zrozumiał zakładkę ... weź mechaniczną maszynę do pisania i pobaw się nią przez chwilę, naprawdę! 1 tabulator to nie 8 spacji! równa się up_to_8_spaces ! otoh: w przypadku czcionek proporcjonalnych tabulatory są jedynym sposobem na zapewnienie wyrównania.
3
„W danym edytorze tabulator może mieć 8 spacji lub 2”. Jeśli lubię 4 spacje, a mój znajomy lubi 8 spacji lub 2 spacje lub 3 spacje lub itd. Wtedy możemy oboje zgodzić się na tabulatory, ponieważ (będąc dedykowanymi znakami wcięć ) redaktor wie, czym one są i może je wyświetlić odpowiednio. Widzę kod z wcięciami o szerokości 4 spacji, widzisz go z wcięciami o szerokości 8 spacji, nasz dziwny przyjaciel używa swoich 3 spacji i wszystko jest w porządku. Okoliczności (szczególnie w Pythonie!), W których sama szerokość tabulacji kiedykolwiek miałaby znaczenie, są tak rzadkie, że nawet zwolennicy spacji rzadko je wspominają.
JamesTheAwesomeDude
-4

O dyskusji między Jimem i Thomasem Woutersami w komentarzach.

Problem polegał na tym, że ... ponieważ szerokość tabulatorów i spacji może się różnić - a ponieważ programiści nie mogą uzgodnić żadnej szerokości - dlaczego tak jest, że winą są tabulatory.

Zgadzam się z Jimem w tej sprawie - zakładki NIE są złe same w sobie. Ale jest problem...

Dzięki przestrzeniom mogę kontrolować wygląd "MÓJ WŁASNY KOD" w KAŻDYM edytorze na świecie. Jeśli użyję 4 spacji - to bez względu na to, w jakim edytorze otworzysz mój kod, będzie miał taką samą odległość od lewego marginesu. W przypadku zakładek jestem zdany na łaskę ustawienia szerokości zakładki dla edytora - nawet dla MÓJ WŁASNY KOD. Nie podoba mi się to.

Tak więc, chociaż prawdą jest, że nawet spacje nie mogą zagwarantować spójności - zapewniają przynajmniej większą kontrolę nad wyglądem własnego kodu wszędzie - coś, czego nie mogą zapewnić tabulatory.

Myślę, że to NIE jest konsekwencja w pisaniu kodu przez programistów - ale spójność w edytorach pokazujących ten kod - że spacje ułatwiają osiągnięcie (i narzucenie).

treecoder
źródło
6
Jesteś „zdany na łaskę ustawienia szerokości tabulatora dla edytora”? Jeśli twój edytor nie pozwala na ustawienie
żądanej
4
@zigg To absolutnie nie ma znaczenia dla argumentacji, ponieważ on (ona?) mówi konkretnie o swoim własnym kodzie (ta informacja jest nawet pogrubiona, kursywą i wszystkie wielkie litery). Nigdzie w dyskusji udostępnianie kodu nie jest istotne.
user137369
1
Redaktorzy nie są jedynymi narzędziami do przeglądania kodu. Istnieją również różnice, elementy śledzące, Github i inne strony internetowe, i tak dalej, które będą wybierać szerokość karty poza twoją kontrolą (prawdopodobnie 8).
RemcoGerlich
Rozumiem co masz na myśli. Rzeczywiście kontrolujesz sposób, w jaki wszyscy widzą Twój kod (w odniesieniu do wcięć). Następnym krokiem jest kontrolowanie typu czcionki i kolorystyki, których wszyscy będą używać, aby zobaczyć Twój kod. Po tym jesteś gotowy, aby zdominować świat, a nie tylko edytory kodu !!
Djunzu