web-dev-qa-db-ja.com

インデントするタブとスペースのPythonの解釈

少しPythonを学ぶことにしました。最初の紹介では、インデントを使用してステートメントをグループ化するとしています。最善の習慣は明らかにこれらの1つだけを使用することですが、それらを交換するとどうなりますか? 1つのタブに等しいと見なされるスペースの数はいくつですか?または、タブとスペースが混在している場合はまったく機能しませんか?

32
Lukas

スペースはタブと同等として扱われません。タブでインデントされた行は、1、2、4でインデントされた行とは異なるインデントにあります または8 スペース。

反例による証明(誤り、またはせいぜい限定-タブ!= 4スペース):

x = 1
if x == 1:
^Iprint "fff\n"
    print "yyy\n"

^I」は TAB。 Python 2.5を実行すると、エラーが発生します。

  File "xx.py", line 4
    print "yyy\n"
                ^
IndentationError: unindent does not match any outer indentation level

したがって、Python 2.5では、タブはスペースと等しくありません(特に4つのスペースと等しくありません)。


おっと-恥ずかしい;反例による私の証明は、タブが4つのスペースに相当しないことを示しています。 Alex Martellicomment で指摘しているように、Python 2では、タブは8つのスペースと同等であり、例をタブと8つのスペースで適応すると、これは確かにそうです。

x = 1
if x != 1:
^Iprint "x is not 1\n"
        print "y is unset\n"

Python 2では、このコードは機能し、何も出力されません。


Python 3では、ルールが少し異なります( noted by Antti Haapala のように)。比較:

Python 2は言う:

最初に、タブは(左から右に)1から8スペースに置き換えられ、置換までの合計文字数は8の倍数になります(これはUnixで使用されるのと同じ規則であることが意図されています)。最初の空白以外の文字の前にあるスペースの総数によって、行のインデントが決まります。バックスラッシュを使用して、インデントを複数の物理行に分割することはできません。最初のバックスラッシュまでの空白がインデントを決定します。

Python 3は言う:

タブは(左から右に)1から8個のスペースに置き換えられ、置き換えを含む文字数の合計は8の倍数になります(これは、Unixで使用されるのと同じ規則であることが意図されています)。最初の空白以外の文字の前にあるスペースの総数によって、行のインデントが決まります。バックスラッシュを使用して、インデントを複数の物理行に分割することはできません。最初のバックスラッシュまでの空白がインデントを決定します。

(冒頭の「First」という言葉は別として、これらは同じです。)

Python 3は追加の段落を追加します:

ソースファイルでタブとスペースが混在し、意味がスペース内のタブの価値に依存する場合、インデントは一貫性がないとして拒否されます。その場合、TabErrorが発生します。

これは、 TAB Python 2で機能していた8スペースの例と比較すると、Python 3でTabErrorが生成されます。Python 3では、インデントを構成する文字のシーケンスを確実にすることが最善です。ブロックの各行で同じです。 PEP8 は、「インデントレベルごとに4つのスペースを使用する」と述べています。 (Googleのコーディング標準では、「2つのスペースを使用する」と記載されています。)

35

フォロー PEP 8 for Python style。PEP 8は言う:インデント

インデントレベルごとに4つのスペースを使用します。

めちゃくちゃにしたくない本当に古いコードの場合は、8スペースのタブを引き続き使用できます。

タブまたはスペース?

タブとスペースを混在させないでください。

インデントの最も一般的な方法Pythonはスペースのみです。2番目に一般的な方法はタブのみです。タブとスペースの混合でインデントされたコードは、スペースのみを使用するように変換する必要があります。 Pythonコマンドラインインタープリターを-tオプションを指定して呼び出すと、タブとスペースが不正に混在しているコードに関する警告が表示されます。-ttを使用すると、これらの警告がエラーになります。これらのオプションを強くお勧めします!

18
Eli Bendersky

Python 2では、 TAB 8スペースのタブストップを使用してスペースに変換されたかのようになります(以前の回答で既に提供されています)。つまり、それぞれ TAB 結果のインデントが8で割り切れるように、インデントを1〜8スペース進めます。

ただし、これはPython 3には適用されなくなりました Python 3スペースとタブの混在は常にエラーです -タブはタブにのみ一致し、スペースは他のスペースにのみ一致しますインデント;それはインデントされた行です TABSPACESPACE でインデントされた行も含めることができます SPACESPACETAB;でインデントされたインデントされたブロックを含む可能性があります TABSPACESPACETAB、ただしそれがインデントされたブロックに含まれる場合 TABTAB、ブロックがさらに拡張されているように見えても、インデントエラーと見なされます。

ソースファイルでタブとスペースが混在し、意味がスペース内のタブの価値に依存する場合、インデントは一貫性がないとして拒否されます。その場合、TabErrorが発生します。

つまりアルゴリズムは次のように機能します。

  • タブの数の両方のスペースが(順序に関係なく)前の行と一致する場合、この行は前の行と同じブロックに属しています

  • (タブ、スペース)のいずれかの数が前の行よりも多く、もう一方の数が前の行の数と少なくとも等しい場合、これはインデントされたブロックです

  • タプル(tabs, spaces)は前のブロックのインデントに一致します-これはそのブロックにインデント解除します

  • それ以外の場合は、IndentationErrorまたはTabErrorが発生します。

これが、タブとスペースを混在させること、またはインデントにタブを使用することさえ、Pythonでは非常に悪い習慣と見なされる理由です。

8
Antti Haapala

それらを交換しないでください:)
「タブ」を押して4つのスペースを入力するようにIDE /エディターを設定すれば、問題ありません。

5
shylent

私はあなたが通過することをお勧めします PEP 8 これは '公式' PythonスタイルガイドPythonコードです。それは(とりわけ)タブ/スペースの使用。

5
Noufal Ibrahim

4つのスペースは(私の設定では)1つのタブですが、私の知る限り、それらは入れ替えられていません。スペースまたはタブのいずれかを使用できます。両方を使用することはできません。

2
Amirshk

タブ文字は、いかなる状況においてもソースコードに表示されるべきではないと思います。それには利点がなく、小さなエラーの無限の原因です。 -タブが必要な場合は、\ tで文字列を使用します。これは、自己文書化するという利点があります。

ここ はタブとスペースの古典的な記事です-私は自分の.emacsファイルでjwzのelispのバリアントを使用しています。

(私は、PEP 8で2文字のインデントのみを使用して個人的に改行することを告白します。行が80文字しかない場合、4文字は多くなります...)

0
Tom Swirly