私はPythonを少し学ぶことにしました。最初の紹介では、ステートメントをグループ化するためにインデントを使用すると述べています。最善の習慣は明らかにこれらの1つだけを使用することですが、それらを交換するとどうなりますか?1つのタブに等しいと見なされるスペースの数はいくつですか?または、タブとスペースが混在していると、まったく機能しなくなりますか?
7 に答える
スペースはタブと同等として扱われません。タブでインデントされた行は、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つのスペースを使用する」とされています。)
PythonスタイルについてはPEP8に従ってください。PEP 8によると:インデント
インデントレベルごとに4つのスペースを使用します。
混乱させたくない本当に古いコードの場合は、引き続き8スペースタブを使用できます。
タブまたはスペース?
タブとスペースを混在させないでください。
Pythonをインデントする最も一般的な方法は、スペースのみを使用することです。2番目に人気のある方法は、タブのみを使用する方法です。タブとスペースを組み合わせてインデントされたコードは、スペースのみを使用するように変換する必要があります。-tオプションを指定してPythonコマンドラインインタープリターを呼び出すと、タブとスペースが不正に混在するコードに関する警告が発行されます。-ttを使用すると、これらの警告はエラーになります。これらのオプションを強くお勧めします!
Python 2では、の解釈は、TAB8スペースのタブストップを使用してスペースに変換されたかのようになります(以前の回答ですでに提供されています)。つまり、それぞれTABがインデントを1〜8スペース進めて、結果のインデントが8で割り切れるようにします。
ただし、これはPython3には適用されなくなりました。Python3では、スペースとタブの混合は常にエラーになります。タブはタブとのみ一致し、スペースはインデント内の他のスペースとのみ一致します。つまり、インデントされたブロックには、でインデントTABSPACESPACEされたブロックが含まれている可能性がありますが、でインデントされたブロックは含まれていTABSPACESPACETABない可能性がありますTABTABTAB。ブロックがさらに拡張されているように見えても、インデントエラーと見なされます。
ソースファイルがスペース内のタブの価値に依存する意味になるようにタブとスペースが混在している場合、インデントは矛盾しているとして拒否されます。その場合、TabErrorが発生します。
つまり、アルゴリズムは次のように機能します。
タブの数とスペースの数の両方が前の行と一致する場合(順序に関係なく)、この行は前の行と同じブロックに属します
(タブ、スペース)の一方の数が前の行よりも多く、もう一方の数が少なくとも前の行の数と等しい場合、これはインデントされたブロックです
タプル
(tabs, spaces)
は前のブロックのインデントと一致します-これはそのブロックにインデントしますそれ以外の場合は、
IndentationError
またはTabError
が発生します。
これが、タブとスペースを混在させたり、インデントにタブを使用したりすることさえ、Pythonでは非常に悪い習慣と見なされる理由です。
それらを交換しないでください:)
「タブ」を押したときに4つのスペースを入力するようにIDE/エディタを設定してください。
Pythonコードの「公式」PythonスタイルガイドであるPEP8を実行することをお勧めします。それは(とりわけ)タブ/スペースの使用をカバーしています。
4つのスペースは(私のセットアップでは)1つのタブですが、私が知る限り、それらは交換されていません。スペースまたはタブのいずれかを使用できますが、両方を使用することはできません。
タブ文字は、いかなる状況でもソースコードに表示されるべきではないと私は信じています。それには利点はなく、小さなエラーの無限の原因です。-タブが必要な場合は、\ t付きの文字列を使用します。これには、自己文書化できるという利点があります。
これがタブとスペースに関する古典的な記事です-私は自分の.emacsファイルでjwzのelispのバリアントを使用しています。
(私は、2文字のインデントのみを使用してPEP 8を個人的に破ることを告白します。行が80文字しかない場合、4文字が多くなります...)