it-swarm-eu.dev

Záložky versus mezery v programování v Pythonu

Vždy jsem používal záložky pro odsazování při programování v Pythonu. Ale pak jsem narazil na otázku na SO, kde někdo poukázal na to, že většina programátorů Pythonu používá místo záložek mezery, aby minimalizovala chyby editoru na editoru.

Jak to dělá rozdíl? Existují i ​​jiné důvody, proč by místo Pythonu bylo místo karet použito mezer? Nebo to prostě není pravda?

Měl bych přepnout editoru tak, aby místo tabulátorů vkládal mezery, nebo pokračoval tak, jak jsem zvyklý?

310
Hannes Ovrén

Protože PEP-8 nám říká, abychom použili mezery.

279

Už mě nebaví pronásledování po překlepech (8 mezer? Ne, 7 oops 9 ...) Přepnula jsem své zdroje na 'karty'.

1 tab == 1 úroveň odsazení, stop

Jde o to: pokud chcete zobrazit odsazení jako šířku 4, 8 nebo pi/12, stačí změnit nastavení v textovém editoru, neporušovat kód.

(Osobně používám kartu šířky 4 znaků ... ale někteří by dávali přednost 3 nebo 8 prostorům, nebo dokonce používali písma s proměnnou šířkou.)

426
yota

Tak mluvil Pán: Ty budeš odrážet se čtyřmi mezerami. Nic víc, nic míň. Čtyři budou počty prostorů, které budeš odrážet, a počet tvých vrstev bude čtyři. Osm neoznačíš, ani dvě odrážky, až na ty čtyři. Záložky jsou v pořádku. - Georg Brandl

190
pillmuncher

POUŽÍVEJTE EDITOR, KTERÝ ZOBRAZUJE TAB CHARAKTERY (všechny mezery, pro tento účel). Naprogramujete, nepíšete článek.

Používám karty. V záložkách není prostor pro chybu v jednom prostoru (pokud je můžete vidět). Problém IS, že lidé používají různé editory, a jediná společná věc na světě je: tab == indent, jak je uvedeno výše. Někteří bloke přichází s tabulátorem nastaveným na nesprávný počet mezer nebo to dělá ručně a dělá nepořádek. TAB a používat skutečný editor. (To není jen v rozporu s PEP, je to o C/C + + a dalších bílých-agnostických jazycích také).

/ kroky dolů z mýdlové krabice

76
EmTee

Hlavním důvodem použití záložek nad mezerami je tlačítko backspace. Pokud jsem na lince a chci backspace-odstranit odsazení na právě ten jeden řádek musím zasáhnout backspace 4x, pokud to byly mezery; vzhledem k tomu, že to musím jen jednou zasáhnout, pokud je to karta.

Budu i nadále používat karty, protože - jak bylo řečeno dříve - je snazší převést z karet na mezery, ale ne naopak.

Myslím, že chci napsat jednoduchý program, který převádí kód s mezerami do kódu s kartami, protože jsem rozzlobený mezery. Řídí mě po zdi!

Ach! A pomocí kláves se šipkami procházet doleva a doprava je vždy bolest v zadku, když je to prostor.

UPDATE: Sublime Text 3 nyní smaže plnou soft kartu s klávesou backspace; navigace šipkami je však stále nudná.

 Tabs vs. Spaces for Indentation

UPDATE: Nyní používám vscode a také jsem napsal TabSanity rozšíření pro to vyřešit backspace, smazat a navigace pomocí šipek.

 TabSanity Extension in Action

65
jedmao

Nejvíce "Pythonic" způsob je použít 4 mezery na úrovni odsazení. Překladač Python však rozpozná mezery nebo karty. Jediný gottcha je nesmí nikdy míchat mezery a karty , vybrat jeden nebo druhý. To znamená, že specifikace doporučuje mezery, většina vývojářů používá prostory, takže pokud nemáte opravdu dobrý důvod, proč ne, řekla bych, že jdou s mezerami.

59
ctcherry

Nedávno jsem narazil na článek s názvem Python: Mýty o odsouzení který pojednává o těchto a souvisejících otázkách. Článek má dobré důvody pro doporučení použití mezer při psaní kódu Python, ale určitě existuje prostor pro neshody.

Věřím, že je pravda, že většina programátorů Pythonu používá pouze prostory.

25
Greg Hewgill

Použijte editor, který vám umožní vložit mezery do tabstop, když stisknete klávesu TAB namísto vložení znaku. A pak na to zapomeňte.

17

Můžete míchat karty a mezery ... Ale karta je považována za stejné odsazení jako 8 mezer, takže pokud váš editor není nastaven tak, aby považoval kartu za 8 mezer, o které žádáte potíže při jejich míchání.

12

Jediným nepříjemnostem, s nimiž se setkávám při používání mezer místo karet, je to, že nemůžete snadno odstranit úroveň odsazení; místo jedné karty musíte odstranit čtyři mezery.

11
Ikke

Cítím se velmi silně, že bez ohledu na historickou konvenci jsou karty prostě lepší volbou a měly by nahradit mezery v každém budoucím řádku napsaného Pythonova kódu. Jako vykopání nekompetentního tyrana. Důvodem je: simplicty jako základní hodnota. Použijte dva nebo možná čtyři znaky pro jeden sémantický úkol? Neexistuje žádné ospravedlnění nad rámec tradice, IMO.

9
Robin

Pravidla záložek. Stejný argument pro vnořené smyčky a chcete přivést vnější úroveň smyčky "zpět" 1. Tip: Chcete-li převést starý pythonový kód do tabulátorů, použijte nástroj TabOut, který je k dispozici jako spustitelný soubor na http://www.textpad.com/add-ons/ .

9
Skippy VonDrake

Když jsem se poprvé učil Python, byl jsem poněkud odraden myšlenkou významného bílého prostoru, protože většina jazyků, které se používají, je nepružná. To znamená, že mě ohromila Pythonova schopnost porozumět různým stylům odsazení. Když zvažuji, jaký styl použít pro nový projekt, myslím, že je důležité mít na paměti dvě věci.

  1. Nejprve je důležité pochopit, jak Python interpretuje odsazení. Bryan Oakley zmínil možnost chyb off-by-one při použití karet, ale ve výchozím nastavení to není možné. Toto je lepší vysvětlení v Learning Python, z O'Reilly Media .

V podstatě existuje proměnná (kterou lze změnit přidáním komentáře v horní části zdrojového souboru # tab-width:), který definuje šířku karty. Když Python narazí na kartu, zvětší vzdálenost odsazení na další násobek šířky tabulátoru. Pokud je tedy po levé straně souboru vložena mezera následovaná tabulkou, je další násobek šířky tabulátoru 8. Pokud je zadána samotná karta, stane se to samé.

Tímto způsobem je bezpečný, pokud je váš editor správně nakonfigurován, používat karty a dokonce míchat karty a mezery. Pokud nastavíte zarážky editoru na stejnou šířku jako deklarace šířky tabulátoru Python (nebo 8, pokud chybí). Obecně je špatný nápad použít editor s šířkou karty jiné než 8 mezer, pokud v souboru nezadáte šířku tabulátoru.

  1. Za druhé, mnoho syntaktického návrhu Pythonu má podpořit čitelnost kódu a konzistentní styl mezi programátory ve stejném projektu. To znamená, že otázka se stane pro jakýkoliv konkrétní projekt tím, co kód učiní nejčitelnějším {od lidí pracujících na projektu. Je jistě dobrý nápad zachovat konzistentní styl odsazování, ale v závislosti na platformě a editoru, který projekt používá, může mít jiný styl smysl pro různé projekty. Pokud neexistuje žádný přesvědčivý důvod, proč se neshodují s PEP 8 , pak to dává smysl, protože bude odpovídat tomu, co lidé očekávají.

Setkal jsem se s projekty, které úspěšně používají kombinaci karet a mezer. Mezery se v podstatě používají k odsazení malých částí, kde je skutečnost, že je v odsazené sekci, relativně nedůležité; zatímco karty jsou používány upozornit čtenáře na velký konstrukční prvek. Třídy začínají například na kartu, kterou jednoduché podmíněné kontroly uvnitř funkce používají dvě mezery.

Záložky jsou také užitečné při práci s velkými bloky víceúrovňových odsazených textů. Když vynecháte 3-4 úrovně odsazení, je mnohem jednodušší zarovnat se s příslušnou záložkou, než je zarovnat se správným počtem mezer. Pokud projekt nepoužívá doporučený styl PEP 8, je pravděpodobně nejlepší napsat průvodce stylem do souboru někde tak, aby vzor odsazení zůstal konzistentní a ostatní lidé mohli číst výslovně, jak nakonfigurovat editor tak, aby odpovídal.

Python 2.x má také možnost -t vydávat varování o smíšených kartách a mezerách a -tt k vydání chyby. To platí pouze pro smíšené karty a mezery ve stejném oboru. Python 3 předpokládá -tt a pokud jsem zjistil, neexistuje žádný způsob, jak tuto kontrolu zakázat.

8
Perkins

Jsem především programátor C++, ale někdy moje projekty zahrnují malé množství Pythonu. Používám karty pro odsazení kódu C++. To znamená, že zde mám tři možnosti:

  1. Používejte záložky v C++ a mezery v Pythonu. To umožňuje, aby mé soubory C++ zůstaly tak, jak jsou a já následuji doporučení PEP-8, ale v rámci mého projektu jsem v rozporu.
  2. Změnit můj C++ kód pro použití mezer. To umožňuje, aby všechny mé soubory v rámci mého projektu byly konzistentní, a já následuji doporučení PEP-8, ale vyžaduje, abych se vrátil a změnil všechny soubory C++. Považuji to za špatnou věc, protože dávám přednost kartám.
  3. Používejte karty v mém C++ kódu a Pythonově kódu. Díky tomu je celý můj projekt konzistentní a dovoluje mi používat preferovaný styl odsazení: karty. Nevýhodou je, že nedodržuji standard PEP-8.

U mých projektů jdu obvykle s možností 3.

7
David Stone

Došlo k chybě editoru k editoru, když máte smíšené odsazení v rámci souboru . Vyplývá to následovně: blok kódu je odsazen se 4 mezerami a pak jedna úroveň odsazení "in", je odsazena tabulátory. Nyní to pohané, kteří to udělali (míchání karet a mezer), měli tak, že jeho karty jsou také 4 mezery, takže nevidí žádné problémy a Python nevidí žádné problémy.

Nyní se naše oběť dostane později a má své karty nastavené na 8 míst. Nyní si naše oběti myslí, že kód vypadá, že je vše zablokováno, a opravuje to / odstraňováním jedné úrovně odsazení , která nyní dělá kód vzhled jako je to stále 2 úrovně odsazení, ale je Opravdu jedna úroveň . V tomto okamžiku se všechno peklo uvolní.

Poučením je, že byste nikdy neměli míchat karty a mezery. Pokud se k tomu budete držet, je snadné kód znovu zadat do mezer nebo záložek, bez ohledu na to, které osobně používáte. Nejlepším způsobem, jak zajistit, abyste nemíchali karty a mezery, je vždy spustit python s -tt, což způsobí chybu při smíchání karet a mezer.

Pokud jde o karty a mezery, já osobně používám karty, takže oddělené odsazení od vzhledu - je mnohem snazší změnit vzhled kódu, když je odsazený s kartami, než s mezerami. Vím, že to je v rozporu s tím, co dělá 99% programátorů Pythonu, ale to je moje osobní preference a v každém případě je snadné převést soubor s kartami na rozložený. Reverz není vždy pravdivý, protože můžete náhodně vylomit 4 mezery v řetězcích atd.

7
freespace

Zkušenosti a PEP-8 oba jasně docházejí k závěru, že směšování prostorů a TABs je třeba se vyvarovat. Pokud je chcete smíchat, musíte vizualizovat mezery v IDE - ale pak se uvolníte výhoda Pythonova odsazení, které umožňuje snadné vidění oborů. Vizualizace mezer na obrazovce IDE zmaže displej.

Je-li to buď mezera TAB, nebo, pak to musí být mezery z jednoduchého důvodu: Jeden může přepnout téměř všechny IDE a textové editory, aby automaticky nahradily karty mezerami, ale opak není pravdivý.

I když existují IDE, která mohou automaticky konvertovat úvodní mezery v řádcích na karty, nakonec to povede ke směsi karet a mezer. Zvažte příkazy více řádků, například volání funkcí se spoustou parametrů nebo řetězců doc. Zatímco "ascii-art" je také třeba se vyhnout, může snadno dojít náhodou, že po předních záložkách zůstane jeden prostor.

Další odpovědi přinesly několik argumentů ve prospěch záložek:

  • Bít TAB je efektivnější. Samozřejmě je to pravda, ale všechny textové editory umožňují okamžité vložení požadovaného počtu mezer při stisknutí klávesy Tab
  • Odsazení/Dedenting je jednodušší, když stačí odstranit jednu kartu namísto 2/3/4/8 mezer. Pravda, ale většina textových editorů to dovoluje automaticky: Blokovat výběr, odsazení/dedent jsou základní funkce programovacího editoru, například komentování/odkomentování. Pokud textový editor tuto implementaci nemá, měl by mít alespoň snadno použitelnou makro funkci, se kterou lze dosáhnout stejné věci.
  • Různé programátory jako různé šířky odsazení. To je pravda a jasná výhoda použití pouze TABs. Problémem je interakce s ostatními jednotlivci a/nebo týmy. Aby to fungovalo v reálném světě, každý by se musel dohodnout pouze na všech TABs. Protože se to nestalo, nefunguje to stejně. V reálném scénáři existuje sada pokynů pro kódování, na které se projekt stejně shoduje, a metoda odsazení je jistě jednou z nich - dokonce i v jiných programovacích jazycích, kde jsou důsledky „pouze“ na vizuální úrovni.

Imho, hlavním bodem, že zde chybí většina (ne-li všechny) odpovědi, je interakce mezi týmy nebo jednotlivci, zejména v situacích, kdy seznam účastníků na začátku není znám. Když kód splňuje kód, musí všechny používat karty nebo všechny musí používat mezery. Nelze ji smíchat, aniž by se nakonec spustily problémy s funkčností. Lidé nejsou dokonalí. Nástroje nejsou dokonalé. Proto bychom neměli vůbec používat TABs.

Žádná odpověď není úplná bez odkazu, který Greg uvedl ve své odpovědi již: Python: Mýty o odsouzení

7
cfi

Každý má jiné preference, kolik kódu má být odsazeno. Řekněme, že sdílíte kód s někým a on nebo ona má různé preference týkající se odsazení. Pokud jsou zářezy v záložkách, může váš přítel vždy změnit pouze šířku karty v nastavení editoru. Pokud jsou však odsazení v mezerách, váš přítel bude muset ve skutečnosti změnit zdrojový kód, pokud ho chce nastavit podle svých preferencí. Poté, co se dostanete ke změnám svého přítele, můžete se rozhodnout, že jej změníte zpět podle svých preferencí. V tomto případě se budete muset vypořádat s nudou změny úrovně odsazení tam a zpět, nebo jedna osoba musí přijmout preference druhého v úrovni odsazení. Pokud vy i váš přítel používáte karty, je skutečnost, že máte jiné předvolby, problémem, protože každý může vidět různé úrovně odsazení, zatímco kód zůstává nezměněn. Proto jsou podle mého názoru karty lepší než mezery pro odsazení ve všech programovacích jazycích. 

6
Zhehao Mao

Existuje scénář, ve kterém karty prostě nefungují, a to: v závislosti na používaném stylu kódování může být nutné odsadit některé řádky kódu na přesnost jednoho prostoru, tj.:

def foobar():
    x = some_call(arg1,
                  arg2)

V takovém případě nebude použití čistě karet fungovat vůbec; použití záložek pro hlavní odsazení a mezery pro dílčí odrážku bude fungovat, ale bude porušovat tvrdé pravidlo, že se obě funkce nemísí.

To však neplatí, pokud se použije dokument/konvence kódování, které se vyhýbají situacím, jako je výše uvedený příklad kódu.

5
Erik Allik

Kromě všech již uvedených argumentů to považuji za poměrně důležité (od Mýty o odsazení ):

Karty se často během operací kopírování a vkládání nebo při vkládání části zdrojového kódu do webové stránky nebo jiného druhu značkovacího kódu často zničí nebo nesprávně převedou.

Další argument (silně specifický pro prostředí, i když) proti kartám je, že jsou někdy chybí na klávesnici telefonu . To by mohlo být pravděpodobně napraveno instalací alternativní klávesnice, pokud je to možné.

Karta argument for, o které se zdálo, že dosud nikdo neuvádí, že 1 karta je 1 znak (0x09, 1 bajt v souboru), zatímco 4 mezery jsou 4 znaky (4krát 0x20, 4 bajty v souboru) ; použití mezer má tedy za následek 4x plýtvání prostorem.

K závěru tohoto nekoherentního seznamu argumentů bych chtěl citovat Tim Petersovu odpověď v vydání 7012: Záložky jsou lepší než mezery pro odsazení :

Standard Python "only only" je pro distribuovaný kód . Roky dlouholetých zkušeností nás bezpochyby naučily, že karty Způsobily nekonečné problémy s shared code (...)

4
chronos

Problém s použitím mezer místo karet je velikost souboru tak neuvěřitelně velká .. Například 500kb prostor-odsazený soubor by mohl být snížen na 200kb při výměně prostor pro karty, což je důvod, proč jsem vždy použít karty.

Menší velikost souboru znamená rychlejší načítání, kompilaci, provádění (v některých případech) atd.

Pro mě není důvod používat mezery, ale pokud někdo používá editor, který má problémy s kartami, pak může nahradit "" nebo "" nebo cokoliv.

3
Acecool

Jak to dělá rozdíl?

Některé editory jsou ve výchozím nastavení nakonfigurovány tak, aby nahradily znak jedné karty nastaveným počtem znaků mezer, ale některé nejsou. Pokud každý používá mezery, tento rozdíl v nastavení výchozího editoru lze ignorovat.

Existují i ​​jiné důvody, proč by místo Pythonu bylo místo karet použito mezer? Nebo to prostě není pravda?

Ano, existují i ​​jiné platné důvody, na které poukázalo mnoho odpovědí přede mnou. "PEP-8" říká, že to však není jeden z těchto důvodů. To pochází ze samo trvajícího mýtu, že PEP-8 je kódovací standard pro kód all Python, když ve skutečnosti je to jen kódovací standard pro standardní sadu knihoven Python. Někteří prohlašují, že PEP-8 je široce přijímaný, a někteří prohlašují, že většina Python programátorů používá mezery místo záložek. Chtěl bych požádat o důkazy o těchto nárocích, protože počet hlasů na této stránce CLEARLY ukazuje, že karty jsou preferovány masami. Považuji za docela nešťastné, že jste přijali „PEP8 to říká“ jako odpověď na vaši otázku, když ve skutečnosti existuje mnoho dalších odpovědí, které ve skutečnosti vysvětlují relativní výhody a nevýhody mezer a záložek.

Měl bych přepnout editoru tak, aby místo tabulátorů vkládal mezery, nebo pokračoval tak, jak jsem zvyklý?

Záleží na tom, a odpověď na tuto poslední otázku je, kde jsem si myslel, že bych mohl do této nitě skutečně přidat nějakou hodnotu. IMHO, bez ohledu na používaný jazyk, nejlepší kódovací standard, který se má použít, závisí na situaci, ve které se nacházíte:

  • Pokud jste začali pracovat na již existující kódové základně: nebuďte obtížní, postupujte podle existujícího standardu kódování
  • Pokud tým začíná na novém projektu od nuly: diskutovat, rozhodnout se o standardu kódování na začátku jako o týmu a držet se ho
  • Pokud jedete sólo: udělejte vše, co vám umožní, abyste se cítili nejšťastnější a nejproduktivnější

Která situace spadá pod?

A konečně, abych se vyjádřil jasně, pro své vlastní sólové projekty používám karty, protože karty mají pro mě větší smysl, a já jsem s kartami produktivnější.

3
wookie919

Toto je PEP 8 od července 2017:

Enter image description here

Zdá se, že toto prohlášení nezanechává prostor pro jinou volbu.

Ale to není jen to, co nám PEP 8 říká, o několik řádků později:

Enter image description here

Ve výše uvedeném, první příkaz vyjadřuje preference pro mezery, a druhé prohlášení potvrzuje existenci kódu odsazeného tabulátory a tuto preferenci pro některé kodéry.

So: PEP 8 je tolerantní k odsazení karty. Netoleruje však tabulátor a mezeru smíšené pro odsazení, což je pochopitelné, protože samotné odsazení je povinné.

Za zmínku stojí, že styl kódování Google Python také následuje pravidlo 4-prostoru.

Tam jsou jiné různé argumenty a ospravedlnění ve prospěch jeden karty nebo 4-prostor.

Pokud pracujete ve společnosti, která vynucuje PEP 8, nebo pravidelně sdílejte svůj kód s ostatními, kteří následují PEP 8, pak zdravý rozum diktuje 4-prostor. Jsem (možná), zvyklý na záložky z C/C++. Ale se správně nastaveným IDE se rozdíl stane minimálním.

3
calocedrus

Místo karet použijte mezery, a to pouze z toho důvodu, že vyděláte více peněz :)

Ref .: Vývojáři, kteří používají prostory, aby více peněz než ti, kteří používají karty (Stack Overflow blog post). 

3
Antonio

Tady jsem četl všechny odpovědi a přemýšlel, jak mohu vyhovět PEP-8, aniž by mrzutost z bušení můj backspace tlačítko opakovaně jen k odstranění odsazení, a dívám se dolů na mé Logitech herní klávesnice se všemi jeho luxusní makro tlačítek a světlo žárovka se rozsvítí v mé hlavě. Otevřel software logitech, definoval pár maker pro tlačítka hned vedle tlačítka karty a vyřešil problém. Jedno tlačítko přidává čtyři mezery, druhé čtyřnásobně. Úžasný. Prostě úžasné. Tak snadné stisknout tlačítka s mými pinky, taky. Podívejte se na toto: "" <- čtyři mezery! Jedním stisknutím tlačítka! Kdybych vám mohla ukázat prostory, které bych taky udělal. Jděte si klávesnici Logitech G105 a všechny vaše problémy zmizí!

2
zephos2014

Domnívám se, že existuje řešení, jak:

  1. Kompatibilita s PEP-8 a použití mezer 
  2. Pohodlí použití karty místo 4 mezer

V programu Poznámkový blok ++ přejděte na "předvolby" -> "nastavení záložek" a vyberte ze seznamu vpravo položku Python. Pak se ujistěte, "tab velikost: 4", a zaškrtněte políčko "nahradit [tab] by space". V tomto případě můžete jednoduše použít tabulátor k odsazení, ale Notepad + + to ve skutečnosti transformuje na 4 místa.

2
Saeed

Já jen začínám, ale je mnohem snazší používat karty než mezery a nerozumím pouze PEP-8 obhajování mezer. Sublime Text 2 dělá skvělou práci vizualizačních karet s off-white vertikální, tečkovanou čarou a když existují případy, kdy jsem míchal prostor nebo dva, aby se spojily prvky seznamu nebo slovníku, nezažil jsem situaci, kdy by to mohlo být být škodlivou věcí. 

1
gr33kbo1

Miluji karty, ale je to nějak nekompatibilní s jiným pravidlem, které mám rád: limit 80 sloupců.

Pokud vyberete 4 tabulátory mezer a vloží 10 záložek, pak zbývá místo pro 40 znaků, aby splnil limit 80 sloupců. Pokud jiný kodér preferuje 8 tabulátorů mezer, stejný řádek bude mít délku 120 znaků a bude nezobrazí se jako platný řádek 80 sloupců!

Pokud chcete definovat limit sloupce 80, musíte zvolit délku karty. V tomto případě nemá x mezery nebo tabulku délky x žádný rozdíl.

Edit: related thread: Udržování maximální délky linky při použití záložek namísto mezer?

1
Mathieu Villion

Myslím si, že jednou z hlavních výhod používání prostor je, že odstraníte variabilitu v tom, jak je zdrojový kód vykreslován napříč množstvím externích nástrojů, které musí komunikovat se zdrojem nad rámec volby editoru a bez ohledu na nastavení, ve kterých jsou nastaveny.

Některé z konkrétních příkladů považují vykreslování Pythonových textových textů v popisku v Visual Studio Code , nebo v nástroji diff jako Beyond Compare nebo WinMerge , nástroje pro pokrytí výkonu nebo kódové pokrytí atd. V podstatě všechny tyto různé další nástroje mohou mít různá nastavení pro interpretaci karet a mohou být nepříjemné a občas dezorientující najít věci, které jsou zcela odlišné nebo posunuté mimo obrazovku mezi sadami nástrojů, do kterých se můžete ponořit.

Stručně řečeno, definujete zarovnání ve zdroji, místo toho, abyste se v rámci svého arzenálu snažili o jednotnou konfiguraci sady nástrojů. Prostory jsou striktně interpretovány v monospace písmo, aby bylo zajištěno spolehlivé a konzistentní zarovnání napříč celým rozsahem nástrojů díky definici písma, nikoli implementaci/konfiguraci karty třetí strany.

Dalším úhlem je kopírování zdroje záložek, které mají být spuštěny v terminálu, kde znak karty může spustit neúmyslné dokončení karty. Pokud například kopírujete následující zdroj Python (karty používané jako odsazení),

cmd_create_db = '''CREATE TABLE test (
    Col1 INTEGER,
    Col2 INTEGER,
    Col3 TEXT)'''

můžete vidět něco podobného (viz integrovaný terminál Visual Studio Code) ...

>>> cmd_create_db = '''CREATE TABLE test (
... .DS_StoreCol1 INTEGER,
... .DS_StoreCol2 INTEGER,
... .DS_StoreCol3 TEXT)'''
>>> cmd_create_db
'CREATE TABLE test (\n.DS_StoreCol1 INTEGER,\n.DS_StoreCol2 INTEGER,\n.DS_StoreCol3 TEXT)'

(Aside: přemýšlel jsem, jestli toto pozorování konzistence napříč nástroji je známkou diskriminační mysli ostrého vývojáře, který chce nařídit světu, který může naznačovat náznak rozdílu v platu, který byl nalezen v Stack Overflow.)

1
jxramos

Používám dvě mezery a editor (kwrite), který vkládá mezery namísto záložek, když jsem stiskl klávesu tabulátoru.

0
David Locke

Nedávno jsem se musel zabývat existujícím kódem, který míchal prostory a karty, je to opravdu matoucí.

Když mícháte (což byste opravdu neměli dělat, ale to tam bohužel existuje), zdá se, že "1 karta == 1 úroveň odsazení" není pravdivá.

Vezměte následující příklad (zkuseno s Pythonem 2.7):

# Mostly use spaces
class TestClass:
    def __init__(self):
        self.total = 0

    def add(self, x):
        # 8 spaces at the start of the following line:
        self.total += x
        # SO automatically uses spaces, but use tabs in the next 2 lines.
        # One tab at the start of the following line:
        if self.total > 10:
                # Two tabs at the start of the following line:
                print "Greater than 10!"
        # Now use spaces again.

        return self.total

tc = TestClass()

print "Total: %d" % (tc.add(5),)
print "Total: %d" % (tc.add(5),)
print "Total: %d" % (tc.add(5),)

Jsou zde 4 mezery před def add(...) (1 úroveň identifikace), 8 mezer před self.total += x (2 úrovně odsazení) a jedna karta před if self.total > 10.

Tato karta se však chová jako 2 úrovně odsazení, protože tento kód funguje. Naopak, pokud nahradíte všechny karty 4 mezerami (jedna úroveň odsazení, kde je def uvnitř třídy), před return se zobrazí neočekávaná chyba odsazení, protože již není v bloku def.

Toto je opravdu matoucí s editory, které zobrazují karty jako 4 znaky. To lze samozřejmě konfigurovat, ale to se týká také prohlížečů zdrojových kódů (např. Podobných GitHub), kde to není nutné snadno konfigurovat (nebo okamžitě vidět, že to musíte udělat, když můžete).

Karta v.s. chování prostoru bude vždy záviset na editoru:

  • Pokud editor automaticky vloží mezery, kdykoliv stisknete kartu, vloží správný počet mezer, takže jiný editor zobrazí přesně stejný styl.
  • Pokud váš editor nepoužívá karty, vždy existuje možnost, že si nebudete všimnout čáry, která používá mezery místo karet (zejména pokud jsou v projektu použity jiné editory).

Oba mají své nevýhody. Pointa je, že musí existovat libovolná volba mezi kartami a mezerami, ale nikdy by neměla být míchána. Vzhledem k tomu, že nikdy nevíte, jak bude váš kód číst a používat později, je dobré mít konvenci, která ovlivní všechny kódovače pythonu. PEP-8 říká, že je to prostor.

Důležité je neudělat to způsobem Java :

Jako jednotka odsazení by měly být použity čtyři mezery. Přesná konstrukce odsazení (mezery vs. záložka) není specifikována. Tabulky Musí být nastaveny přesně každých 8 mezer (ne 4).

Ano ... 1 karta = 2 úrovně odsazení v prostředí Java! Naštěstí nemá stejný význam z hlediska kompilace.

0
Bruno

Lidé budou používat různé editory na stejném kódu. Tyto editory budou zobrazovat kartu na obrazovce jinak. Pokud pracujete na editoru, který představuje kartu jako 4 mezery, pokud odsadíte první řádek znakem "\t " a druhý znak "\t\t", budou vypadat, že jsou ve stejné úrovni odrážek: 8 mezer. 

Překladač Python váš editor nezná a musí kartu interpretovat jako určité množství odsazení. Ve skutečnosti interpretuje kartu jako 8 mezer, takže uvidí různé úrovně odsazení než to, co jste zamýšleli: 12 mezer pro první řádek, 16 mezer pro druhý řádek. Jsi opékaný. 

0

Více obskurní (k nějakému!) Argumentu na straně karty: Řekli mi, že karty fungují lépe se scénáři pro nevidomé.

0
Peter Drake

Nedávno jsem přešel z karet na mezery, pro dodržování pravidel PEP 8.

Karty se mi líbily dříve ze dvou důvodů:

  1. S kartami může každý vidět kód s úrovní odsazení své volby ; stačí použít mezery vpravo a karty vlevo.
  2. chcete, aby karty byly dost špatné

... ale poté, co jsem si uvědomil, jak důležitý PEP 8 se stal, jsem přešel stejně. Jak vidím, hlavní hodnotou prostorů nad kartami je jednoduchost - to, co vidíte, je to, co máte. Dodržování PEP 8. A já jsem přišel s pravidlem Vim, které by zapnulo prostory pro soubory Pythonu a ponechalo tabulku Makefile.

0
user1277476