2016-03-17 22 views
5

タブとスペースについて多くの質問がありますが、PEP 0008がPython 3について言うこととは対照的に、タブとスペースを混ぜることは常に違法ではないようです。具体的には、同じブロック内のタブとスペースを混在させることはできませんが、スペースがあるブロックとタブ付きのブロックは同じファイル内で使用できます。Python 3では空白とタブを混ぜることができますか?

は例えば、これは、Python 3.4のTabErrorスロー:

for x in range(10): 
    print(x) # Spaces 
    print(x) # Tab 

をしかし、これは正常に動作:

for x in range(10): 
    print(x) # Spaces 

for y in range(5): 
    print(y) # Tab 

これは仕様によるものですか?

編集:質問がではなく、タブがスペースよりも優れているかどうか。問題は、Pythonが同じファイル内のタブとスペースを許すかどうかです。

答えて

4

このためテストは(Lib/tests/test_exceptions.py)非常に単純です:これは単にインデントの種類を比較するように見える

self.raise_catch(TabError, "TabError") 
    try: compile("try:\n\t1/0\n \t1/0\nfinally:\n pass\n", 
       '<string>', 'exec') 
    except TabError: pass 
    else: self.fail("TabError not raised") 
このエラーは、実際にスローされたコードを見てみると

Parser/tokenizer.ctok_get()の前には行が使用されており、ファイル全体で何が使用されているかはわかりません。

ドキュメントはソースファイルがスペースのタブの価値に意味が依存させる方法でタブとスペースをミックスした場合(Doc/reference/lexical_analysis.rst、強調鉱山)

インデントが矛盾として拒否されたと言います;その場合はTabErrorが発生します。

インデントレベル0に戻って「ブロック」が完全に「分離」されている場合は、タブとスペースを混ぜても問題ありません。タブの幅の設定によってプログラムのロジックが混乱することはありません。 Pythonのタブとスペースを混在させる際の問題は、Python がタブが8つのスペースであるが、プログラマのエディタは他のものを使用するかもしれないと仮定してと仮定していることです。たとえば、次のようなコード:

def my_fun(i): 
    if i == 6: 
     foo() 
------->bar() # Tab 

は、4のタブストップでこのように見えるようになります。

def my_fun(i): 
    if i == 6: 
     foo() 
    bar() 

プログラムが何をするかは明らかではありません!

しかし、のようなケースでは:

def my_fun(i): 
    if i == 6: 
     foo() 
     bar() 

def my_fun2(i): 
--->if i == 7: 
--->--->foo() 
--->--->bar() 

それはロジックが何であるかは必ずしも明確だ、私はタブを表示どんなにとしてビューの「ロジック」の点から大丈夫です。それはまだもちろん単一のファイルにタブとスペースを混在させることは悪いアイデアのだが、それは単に文体エラーではなく、ロジックエラー;-)

がそこで質問に答えるためにだ:その1行でから判断しドキュメント、私は これは仕様だと言うでしょう。私はこれのためのPEPを見つけることができませんが、この ケースはテストされていません。私はそれに頼っていないだろうすべて将来の のPythonバージョンは同じように振る舞います!

1

Pythonは小さなコードブロックを分割しようとします。そのため、コピー&ペーストすると、それでも機能し、すべてを完璧にする必要はありません。 Pythonの多くの美しさの1つ。

PEP 8は、最も読みやすいコードのためだけの大会である、と私はあなたがそれに従わないことをお勧めしますが、あなたはどのようなPEP 8を探したい場合は、

する必要はありませんがある包含しいくつかのエディタはPythonで合法であるが、いいのではない違反についてコードを検査します。私はPyCharmを使用します。 PyCharmは、同じファイル内でスペースとタブを使用すると好きではありません。そして、それはsquiggle under-liningsでsnarkyになります。

+0

"小さなコードブロックを分割しようとする"という意味を理解しているかどうか分かりません。 – Carpetsmoker

関連する問題