36

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

4

7 に答える 7

41

スペースはタブと同等として扱われません。タブでインデントされた行は、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 Martelliがコメントで指摘しているように、Python 2では、タブは8つのスペースに相当し、例をタブと8つのスペースに適合させると、これが実際に当てはまることがわかります。

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

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


Python 3では、ルールが少し異なります(Antti Haapalaよると)。比較:

Python 2によると:

まず、タブが(左から右に)1から8のスペースに置き換えられ、置き換えを含む文字の総数が8の倍数になります(これは、Unixで使用されるのと同じルールであることが意図されています)。次に、最初の非空白文字の前のスペースの総数によって、行のインデントが決まります。インデントは、円記号を使用して複数の物理行に分割することはできません。最初の円記号までの空白がインデントを決定します。

Python 3によると:

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

(冒頭の「First」という言葉を除けば、これらは同じです。)

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

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

これはTAB、Python2で機能したvs8スペースの例では、Python 3でTabErrorが生成されることを意味します。Python3で必要なのは、ブロックの各行のインデントを構成する文字のシーケンスが同じであることを確認することです。 。 PEP8は、「インデントレベルごとに4つのスペースを使用する」と述べています。(Googleのコーディング標準では、「2つのスペースを使用する」とされています。)

于 2010-01-09T18:59:33.023 に答える
21

PythonスタイルについてはPEP8に従ってください。PEP 8によると:インデント

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

混乱させたくない本当に古いコードの場合は、引き続き8スペースタブを使用できます。

タブまたはスペース?

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

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

于 2010-01-09T19:02:22.890 に答える
11

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

ただし、これはPython3には適用されなくなりました。Python3では、スペースとタブの混合は常にエラーになります。タブはタブとのみ一致し、スペースはインデント内の他のスペースとのみ一致します。つまり、インデントされたブロックには、でインデントTABSPACESPACEされたブロックが含まれている可能性がありますが、でインデントされたブロックは含まれていTABSPACESPACETABない可能性がありますTABTABTAB。ブロックがさらに拡張されているように見えても、インデントエラーと見なされます。

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

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

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

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

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

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

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

于 2014-08-24T12:30:16.277 に答える
6

それらを交換しないでください:)
「タブ」を押したときに4つのスペースを入力するようにIDE/エディタを設定してください。

于 2010-01-09T19:01:18.853 に答える
5

Pythonコードの「公式」PythonスタイルガイドであるPEP8を実行することをお勧めします。それは(とりわけ)タブ/スペースの使用をカバーしています。

于 2010-01-09T19:01:45.157 に答える
2

4つのスペースは(私のセットアップでは)1つのタブですが、私が知る限り、それらは交換されていません。スペースまたはタブのいずれかを使用できますが、両方を使用することはできません。

于 2010-01-09T18:59:05.677 に答える
-2

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

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

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

于 2010-01-09T23:04:40.820 に答える