web-dev-qa-db-ja.com

Pythonプログラミングにおけるタブとスペース

私はPythonプログラミングをするとき、いつもインデントのためにタブを使いました。しかしそれから私はここで質問に遭遇しましたSO誰かがほとんどのPythonプログラマーがエディタ間のミスを最小にするためにタブの代わりにスペースを使うと指摘しました。

どのように違いがありますか? Pythonでタブの代わりにスペースを使う理由は他にもありますか?それとも単に本当ではないですか?

すぐにタブではなくスペースを挿入するようにエディタを変更するのか、それとも以前と同じように使い続けるのか?

324
Hannes Ovrén

PEP-8 はスペースを使うように指示するからです。

290

字下げミス(8スペース?no、7 oops 9 ...)を追いかけてうんざりしていた私は自分の情報源を「タブのみ」に切り替えました。

1タブ== 1インデントレベル、フルストップ

ポイントは、4、8、またはpi/12文字の幅でインデントを表示したい場合は、テキストエディタで設定を変更するだけで、コードを混乱させないでください。

(個人的には、4文字幅のタブを使用していますが、3スペースまたは8スペースを好み、あるいは可変幅フォントを使用することもあります。)

441
yota

つまり主を語る:あなたは四つのスペースをもって字下げしなければならない。これ以上、少なからず。四つは字下げすべきスペースの数であり、そしてあなたの字下げは四つの字下げでなければならない。 2つのインデントを除いて、4つに進むことを除いて、タブは正しく表示されています。 - Georg Brandl

193
pillmuncher

タブ文字を表示するエディタを使用してください(それに関してはすべて空白)。あなたはプログラミングしていて、記事を書いていません。

タブを使います。タブに1スペースのエラーが表示される可能性がある場合は、その余地はありません。人々が異なるエディタを使用するという問題[IS、および世界で唯一の一般的なことは、上記のようにtab == indentです。タブキーを間違った数のスペースに設定していたり​​、手動でしたりして混乱する人もいます。 TABと実際のエディタを使用してください。 (これは単にPEPに反しているのではなく、C/C++やその他の空白にとらわれない言語についても同じです)。

/ soapboxから降りる

83
EmTee

スペースの上にタブを使用する主な理由は、バックスペースキーです。私が行の上にいて、その1行のインデントをバックスペースで削除したいのであれば、それがスペースであればバックスペースを4倍ヒットしなければなりません。一方、タブの場合は1回だけ押すだけです。

タブをスペースに変換する方が簡単ですが、その逆はできません。

スペースを含むコードをタブを含むコードに変換する単純なプログラムを作成したいと思っています。彼らは私を壁に駆り立てます!

ああ!また、矢印キーを使用して左右に移動するのは、スペースがある場合は常にお尻の痛みです。

更新:Sublime Text 3はバックスペースキーを持つ完全なソフトタブを削除します。ただし、矢印キーによるナビゲーションはやや面倒です

Tabs vs. Spaces for Indentation

更新:私は vscode を使用し、またバックスペース、削除、矢印キーによるナビゲーションを解決するために TabSanity拡張 を書きました。

TabSanity Extension in Action

70
jedmao

最も「Pythonic」の方法はインデントレベルごとに4つのスペースを使うことです。ただし、Pythonインタプリタはスペースまたはタブを認識します。唯一の問題はあなたですスペースとタブを混ぜてはいけません、どちらかを選んでください。とは言っても、仕様ではスペースを推奨していますが、ほとんどの開発者はスペースを使用しています。

60
ctcherry

私が言える限りでは、タブとスペースの長所と短所は次のとおりです。

タブの長所:

  • インデントのインデント、インデント解除、および移動に必要なキーストロークが少なくなります。 (たとえあなたのIDEがいくらかのスペースインデントの巧妙さを持っていたとしても、それはタブのように良くなることは決してないでしょう。)
  • プログラマが異なれば、必要に応じて異なるタブ表示サイズを使用できます。
  • インデント文字の内側にカーソルを置くことはできません。たとえば、いくつかの行をコピーしている場合、タブを使用して行の先頭付近をクリックして選択を開始すると、最初のすべてのタブが表示されます。スペースを使用すると、最初のスペース文字とマージンの間にある小さなターゲットに当たらない限り、最初のスペース文字を見逃す可能性があります。行からインデントを削除するのと同様に、カーソルが4スペースのインデント文字の真ん中にある場合、ほとんどのエディタはバックスペースを押すことをうまく処理しません。通常は1スペース削除されます。タブを使うと期待通りに動きます。
  • 他の言語との一貫性があるので、エディタを使用するように設定する必要はありません。 C++/JavaのタブとPythonのスペース。
  • 間違ったインデントはより明白になることがあります(すなわち、余分なタブは余分なスペースよりはるかに大きいです)。

タブの短所:

  • ほとんどのPythonプログラマーはスペースを使うので、あなたは慣例に反するでしょう。
  • 複数行のステートメントを揃えるためにスペースを使用する方がタブを使用するよりも簡単です。あなたはインデントのためのタブ、整列のためのスペースを使うことができますが、それはPythonでは少々危険です。

何人かの人々によってあふれているいくつかの非問題があります:

  1. タブ付けされたインデントで邪魔なスペースが生じることがあります。事実上、すべてのIDE /エディタで空白の視覚化がサポートされています。とにかくこれが一般的なエラーだとは思えません。その上、mostインデントエラーはPythonによって捕らえられるでしょう、そして良いIDEは異なるインデントを強調することができるはずです。

  2. タブで物事を簡単に揃えることはできません。これは、文字が完全に揃うようにする場合には当てはまりますが、PEP-8ではこれを推奨していません。

  3. 編集者によってタブ表示サイズの設定が異なるため、コードの表示場所が異なります。そう、実際にはタブの便利な機能です。

他のPythonコードと一貫性を保つためにスペースを使用することから始めましたが、正直に言うと、おそらくタブに変更することになるため、十分にイライラすることになります。 IDEの機能に大きく依存しますが、私の経験ではスペースインデントのIDEのサポートはタブを使用するだけでは不十分です。

ですから、あなたが本当にmostと矛盾したくないのでなければ、(おそらくすべてではありません!)タブを使用して空白の視覚化とインデントの強調表示を有効にします(利用可能な場合)。私にとっての最大の理由は、選択のしやすさと(かなり重要なIMO)キーストロークの減少です。いくつかの規約は愚かです。

Update:スペースとして字下げを適切にサポートするエディタが全世界に1つ(Vimのようなナンセンスを除く)あることを発見しました:Atom。 4つのスペースをあたかもそれがタブであるかのように振る舞わせる(それをサイズ変更することができることを除いて)という "atomic tabstops"と呼ばれるオプションがあります。残念なことにAtomは非常に遅くて肥大化したエディタですが、これは素晴らしい機能であり、スペースを使わざるを得ない場合は良い選択かもしれません。いつか他の編集者がそれをサポートし始めることを願っています。 これがVSCodeの問題です

45
Timmmm

私は最近 Python:インデントに関する神話 というタイトルの記事に出会いました。この記事には、Pythonコードを書くときにスペースの使用を推奨する正当な理由がありますが、確かに意見の相違がある余地があります。

私は、ほとんどのPythonプログラマーがスペースだけを使うのは本当だと信じています。

25
Greg Hewgill

Tabキーを押すと、\ t文字を挿入する代わりにタブストップまでスペースを挿入できるエディタを使用します。そしてそれを忘れてください。

17

タブの代わりにスペースを使用することで私が経験する唯一の不都合は、インデントレベルを簡単に削除できないことです。 1つのタブではなく4つのスペースを削除する必要があります。

12
Ikke

タブとスペースを混在させることができます。ただし、タブは8スペースと同じインデントであると見なされるため、エディタがタブを8スペースと見なすように設定されていない限り、混在させるときに問題があります。

歴史的な慣習がどうであれ、タブは単なるより良い選択であり、書かれている将来のPythonコードの行のすべてでスペースを置き換えるべきだと私は非常に強く感じます。無能な暴君を追い出すようなものです。これに対する私の論理的根拠は、コア値として単純化することです。 1つのセマンティックタスクに2文字または4文字を使用しますか?伝統を超えた正当性はない、IMO.

11
Robin

タブの規則入れ子になったループと同じ引数で、外側のループを1レベル戻します。ヒント:古い謎のpythonコードをタブに変換したい場合は、 http://www.textpad.com/add-ons/ にある実行可能ファイルとして利用可能なTabOutユーティリティを使用してください。

11
Skippy VonDrake

ファイル内のインデントが混在するがあると、エディタ間のミスが発生します。これは、次のように発生します。コードブロックは4つのスペースでインデントされ、次に1つのインデントレベル "in"で、タブでインデントされます。今これをしたヘザー(タブとスペースを混ぜる)はそれを持っていたので彼のタブも4つのスペースである、それで彼は問題を見ない、そしてPythonは問題を見ない。

今、私たちの犠牲者は後でやってきて、そして彼は彼のタブを8スペースに設定しています。今、私たちの犠牲者は、コードがすべて叩かれたように見えると思います、そしてそれを修正する by 1レベルのインデントを削除する、それで今のようにコードを作りますlookまだ2レベルの字下げですが、実際には1レベルです。この時点ですべての地獄は緩んで壊れます。

ここでの教訓は、決してタブとスペースを混ぜてはいけないということです。これを守るのであれば、あなたが個人的に使用しているものに関係なく、コードをスペースまたはタブに再インデントするのは簡単です。タブとスペースが混在しないようにするための最善の方法は、常にpython-ttと一緒に実行することです。これは、タブとスペースが混在しているとエラーになります。

タブとスペースに関しては、私は個人的にはタブとインデントを区別して使用しています。タブでインデントされているときは、スペースよりもコードの外観を変更する方がはるかに簡単です。私はこれがPythonプログラマーの99%がしていることとは逆に実行されることを知っていますが、それは私のpersonal好みであり、タブ付きファイルを間隔のあるファイルに変換するのは簡単です。あなたが偶然に文字列などの中に4つのスペースをたたくことができるので、逆は必ずしも真実ではありません。

8
freespace

私が最初にPythonを学んだとき、それを使うためのほとんどの言語は柔軟性がないので、私はかなりのホワイトスペースの考えに少し納得できませんでした。とは言っても、私はPythonがさまざまな字下げスタイルを理解できることに感銘を受けました。新しいプロジェクトにどのスタイルを使用するかを検討する際には、2つのことに留意することが重要です。

  1. まず、Pythonがインデントを解釈する方法を理解することが重要です。 Bryan Oakleyさんは、タブを使用するときに1つずつエラーが発生する可能性について言及しましたが、これは実際にはデフォルトのインタプリタ設定では不可能です。 O'Reilly Media から、Pythonの学習で、これに関するより良い説明があります。

基本的には、タブ幅を定義する変数(ソースファイルの先頭にコメントを含めることで変更できます#tab-width:)があります。 Pythonがタブに遭遇すると、インデント距離をタブ幅の次の倍数に増やします。したがって、ファイルの左側にタブが続くスペースが入力された場合、tab-widthの次の倍数は8になります。タブ自体が入力された場合も、同じことが起こります。

このように、あなたのエディタが適切に設定されていれば、タブを使うこと、そしてタブとスペースを混ぜることさえ安全です。エディタのタブ位置をPythonのタブ幅の宣言と同じ幅に設定している限り(または存在しない場合は8)、ファイルにtab-widthを指定しない限り、一般に8スペース以外のタブ幅を持つエディタを使用するのは悪い考えです。

  1. 次に、Pythonの構文設計の多くは、コードの読みやすさと同じプロジェクトのプログラマー間での一貫したスタイルを促進することです。とはいえ、問題はどんな特定のプロジェクトにとっても、プロジェクトに携わっている人たちにとってコードが最も読みやすくなるということになります。確かに、一貫したインデントスタイルを維持することをお勧めしますが、プロジェクトで使用されているプラ​​ットフォームとエディタによっては、異なるプロジェクトでは異なるスタイルが有効な場合があります。 PEP 8 に準拠しないという説得力のある理由がない場合は、そうすることは理にかなっています。

タブとスペースをうまく組み合わせたプロジェクトに遭遇しました。基本的にスペースは小さなセクションをインデントするのに使われます、それがインデントされたセクションにあるという事実は比較的重要ではありません。タブは、大きな構造上の特徴に読者の注意を引くために使用されます。たとえば、クラスはタブで始まり、関数内の単純な条件付きチェックでは2つのスペースが使用されます。

タブは、インデントされた複数レベルのテキストの大きなブロックを処理するときにも役立ちます。 3〜4レベルのインデントを削除すると、適切な数のスペースと整列するよりも、適切なタブと整列する方がはるかに簡単です。プロジェクトがPEP 8の推奨スタイルを使用していない場合は、インデントパターンの一貫性を保ち、他の人々が自分のエディタを一致するように設定する方法を明示的に読むことができるようにスタイルガイドをファイルに書き込むことがおそらく最善です。

また、Python 2.xには、タブとスペースが混在することに関する警告を出すためのオプション-tと、エラーを出すための-ttがあります。これは、同じスコープ内のタブとスペースが混在する場合にのみ適用されます。 Python 3は-ttを仮定しています、そして私がこれまでに見つけたところでは、そのチェックを無効にする方法はありません。

8
Perkins

私は主にC++プログラマーですが、私のプロジェクトには少量のPythonが含まれていることがあります。タブを使用してC++コードをインデントします。つまり、ここには3つの選択肢があります。

  1. C++ではタブ、Pythonではスペースを使用してください。これは私のC++ファイルをそのままにしておくことを可能にし、私はPEP-8勧告に従いますが、私は私のプロジェクト内で矛盾しています。
  2. スペースを使用するようにC++コードを変更してください。これにより、プロジェクト内のすべてのファイルの一貫性を保つことができ、PEP-8の推奨事項に従いますが、すべてのC++ファイルを元に戻して変更する必要があります。私はタブを好むのでこれは悪いことだと思います。
  3. 私のC++コードとPythonコードでタブを使用してください。これにより、プロジェクト全体の一貫性が保たれ、好みの字下げスタイルであるタブを使用できます。欠点は、私がPEP-8標準に準拠していないことです。

私のプロジェクトでは、私は一般的に選択肢3を使います。

7
David Stone

経験と PEP-8 は、スペースとTABsを混在させることは避けるべきだと明確に結論付けています。それらを混在させたいのであれば、IDEの中の空白を視覚化しなければなりません - しかし、あなたはPythonのインデントの利点を失い、スコープを見やすくします。空白をIDEで視覚化すると、表示が乱雑になります。

それがTABスペースのどちらかであるならば、それは単純な理由からスペースでなければなりません:タブを自動的にスペースに置き換えるためにほとんどすべてのIDEとテキストエディタを切り替えることができますしかし、その逆は真実ではありません。

行の先頭のスペースを自動的にタブに変換することができるIDEがあるとしても、これは結局タブとスペースの混在をもたらすことになります。たくさんのパラメータを持つ関数呼び出しやdoc文字列のような複数行のステートメントを考えてください。 "ascii-art"も避けなければなりませんが、先頭のタブの後に1つのスペースが残っていることが偶然に起こる可能性があります。

他の答えはタブを支持するいくつかの議論をもたらしました:

  • TABを押すほうが効率的です。もちろんこれは事実ですが、すべてのテキストエディタはタブキーが押されたときにすぐに必要な数のスペースを挿入することを許可します
  • 2/3/4/8のスペースの代わりに1つのタブを削除するだけの場合は、インデント/インデント解除が簡単です。 True、しかしほとんどのテキストエディタはとにかくこれを自動的に行うことを可能にします:ブロック選択、インデント/デントはコメント/コメント解除のようなプログラミングエディタの基本的な機能です。テキストエディタがこれを実装していない場合は、少なくとも同じことを実現できる使いやすいマクロ機能が必要です。
  • プログラマーが異なれば、インデント幅も異なります。それは事実です、そしてTABsだけを使うことの明らかな利点。問題は他の個人やチームとの交流です。これが現実の世界で機能するためには、誰もがTABsのみを使用してすべてに同意する必要があります。これは起こっていないので、とにかくうまくいきません。現実世界のシナリオでは、プロジェクトがとにかく合意する一連のコーディングガイドラインがあります。インデントの方法は、その意味の1つです - 他のプログラミング言語でも、暗黙のうちに視覚レベルでのみです。

Imho、ここでは(ほとんどではないにしても)ほとんどの回答が欠けているという主なポイントは、特に参加者のリストが最初からわからないシナリオでは、チームまたは個人間のやり取りです。コードがコードと一致するとき、すべてがタブを使用するか、すべてがスペースを使用する必要があります。機能上の問題が発生しない限り、混在させることはできません。人は完璧ではありません。道具は完璧ではありません。だからこそ私たちはTABsを使うべきではありません。

リンクがなければ完全な答えはありません Gregが彼の答えで提供した すでに: Python:インデントについての神話

7
cfi

どのくらいの量のコードをインデントすべきかについて、誰もが異なる好みを持っています。あなたが誰かとコードを共有していて、その人がインデントに関して異なる好みを持っているとしましょう。インデントがタブの中にある場合、あなたの友人はいつでも彼らのエディタ設定のタブ幅を変えることができます。しかし、字下げがスペースにある場合、あなたの友人がそれを彼らの好みに設定したいのであれば、あなたの友人は実際にソースコードを変更しなければならないでしょう。それからあなたがあなたの友人の変更を受けたら、あなたはそれをあなたの好みに戻すことに決めるかもしれません。この場合は、インデントレベルを前後に変更するという単調な作業に対処する必要があります。または、ある人が他の人の好みをインデントレベルで採用する必要があります。あなたとあなたの友人の両方がタブを使用している場合、コードが変更されないままあなたがそれぞれ異なるインデントレベルを見ることができるのであなたが異なる好みを持っているという事実は問題ではありません。私の考えでは、タブはすべてのプログラミング言語で字下げ用のスペースよりも優れています。

6
Zhehao Mao

タブの代わりにスペースを使用する問題は、ファイルサイズが非常に大きくなることです。たとえば、500 KBのスペースインデントファイルは、タブのスペースを交換するときに200 KBに縮小される可能性があります。

ファイルサイズが小さいほど、ロード、コンパイル、実行(場合によっては)などが速くなります。

私には、スペースを使う意味はありませんが、タブに問題があるエディタを誰かが使っているのであれば、 "\ t"を ""や ""などに置き換えることができます。

5
Acecool

タブが単純に機能しないシナリオがあります。つまり、使用しているコーディングスタイルによっては、コードの一部の行を1スペースの精度でインデントする必要がある場合があります。

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

その場合、純粋にタブを使用してもまったく機能しません。メインインデントにタブを使用し、サブインデントにスペースを使用すると機能しますが、2つを混在させないという厳格な規則に違反します。

ただし、上記のコード例のような状況を回避するコーディングスタイル/規約文書を使用する場合は、これは当てはまりません。

5
Erik Allik

すでにリストされているすべての引数に加えて、私はこれが非常に重要であると思います( インデントに関する神話 から):

また、コピー&ペースト操作中、またはWebページや他の種類のマークアップコードにソースコードが挿入されたときに、タブが破壊されたり誤って変換されたりすることがよくあります。

タブに対するもう1つの引数(ただし、環境に強く依存する)は、タブが 電話のキーボードにはない場合がある です。可能であれば、これはおそらく別のキーボードをインストールすることで解決できます。

1つのタブは1文字(0x09、1バイトはファイル)であり、4つのスペースは4文字(4×0x20、4バイトは4バイト)であるという引数forタブファイル);したがって、スペースを使用すると、スペースが4倍になります。

この矛盾した議論のリストを締めくくるために、私はTim Petersの回答を引用したいと思います Issue 7012:タブはインデントのためのスペースより優れています

Pythonの「スペースのみ」標準は、分散コード用です。何年もの初期の経験から、タブが共有コードに無限の問題を引き起こしていることは疑いの余地がありませんでした(...)

4
chronos

どのように違いがありますか?

一部のエディタは、デフォルトで単一のタブ文字を設定された数のスペース文字で置き換えるように設定されていますが、そうでないものもあります。誰もがスペースを使用する場合、デフォルトのエディタ設定におけるこの違いは無視できます。

Pythonでタブの代わりにスペースを使う理由は他にもありますか?それとも単に本当ではないですか?

はい、私の前で多くの答えによって指摘されるように他の正当な理由があります。 「PEP-8」はそう言っていますが、そのような理由の1つではありません。これはPEP-8がall Pythonコードのコーディング標準であるという自己永続的な神話から来ています。実際、それは実際には標準的なPythonライブラリのセットのコーディング標準にすぎないのです。 PEP-8が広く受け入れられていると主張する人もいれば、ほとんどのPythonプログラマーがタブではなくスペースを使うと主張する人もいます。このサイトの投票数は明らかにタブが大衆に好まれていることを示しているので、私はこれらの主張の証明を求めたいと思います。実際にスペースとタブの相対的な長所と短所を説明している他の多くの答えが実際にあるとき、あなたがあなたの質問に対する答えとして「PEP8がそう言う」と認めたことは非常に残念です。

すぐにタブではなくスペースを挿入するようにエディタを変更するのか、それとも以前と同じように使い続けるのか?

それは異なります、そしてこの最後の質問に対する答えは、私がこのスレッドに何らかの価値を実際に追加できると思ったところです。私見、使用されている言語に関係なく、使用するのに最適なコーディング標準はあなたがいる状況に依存します:

  • 既存のコードベースで作業を始めた場合:難しいことではありません、既存のコーディング標準に従ってください
  • チームが最初から新しいプロジェクトを始めている場合:話し合い、最初にチームとしてコーディング標準を決め、それに固執する
  • あなたが一人で行くのであれば:あなたが最も幸せで最も生産的に感じるようなことを何でもしてください

それで、あなたはどの状況に陥りますか?

最後に、私自身のソロプロジェクトのために私のスタンスを明確にするために、私はタブがより理にかなっているのでタブを使用します、そしてタブの方が生産的です。

3
wookie919

これは PEP 8 2017年7月現在です。

Enter image description here

この声明は他の選択の余地を残していないようです。

しかし、これはPEP 8が私たちに言っていることだけではなく、数行後になります。

Enter image description here

上の例では、最初のステートメントはスペースに対して設定を表し、2番目のステートメントはタブでインデントされたコードの存在と一部のコーダに対するこの設定を認識します。

だから:PEP 8はタブのインデント耐性があります。ただし、インデント自体は必須であるため理解可能です。

GoogleのPythonコーディングスタイル も4スペースの規則に従うことを言及する価値があるかもしれません。

タブまたは4スペースのどちらかを支持する他の さまざまな議論と正当化 があります。

あなたがPEP 8を強制する会社で働いている、またはPEP 8に従う他の人たちとあなたのコードを定期的に共有するならば、常識は4スペースを要求します。私は(多分)C/C++のタブに慣れています。しかし、正しく設定されたIDEでは、違いは最小限になります。

3
calocedrus

両方を解決する方法があると思います。

  1. PEP-8との互換性およびスペースの使用
  2. 4つのスペースの代わりにタブを使用する便利さ

Notepad ++の場合は、「設定」 - >「タブ設定」に進み、右側のリストから「Python」を選択してください。それから "tab size:4"を確認し、 "[tab]をスペースに置き換える"チェックボックスをチェックしてください。この場合、単にTabキーを使用してインデントすることができますが、Notepad ++は実際にはそれを4つのスペースに変換します。

3
Saeed

だからここで私はすべての応答を読んでいて、インデントを削除するためだけにバックスペースボタンを何度も叩いてイライラせずにPEP-8に準拠することができる方法を考えています。私の頭の中で電球が点灯します。

私はLogicoolのソフトウェアを開き、タブボタンのすぐ隣にあるボタンのためにいくつかのマクロを定義しました、そして問題は解決されました。

1つのボタンで4つのスペースを追加し、もう1つのボタンで4回バックスペースします。すごい。すごいね。私の小指でも簡単にボタンを押すことができます。

これをチェックしてください。 "" < - 4つのスペース!ボタンひとつで!私があなたにバックスペースを見せることができれば私もそれをするでしょう。 Logicool G105キーボードを入手して、問題がすべて解消されます。

2
zephos2014

あなたがより多くのお金を稼ぐという唯一の理由のために、タブの代わりにスペースを使う:)

Ref .:タブを使う人よりもスペースを使う人はもっとお金を稼ぐ(Stack Overflowブログ記事)。

2
Antonio

私は始めたばかりですが、スペースよりもタブを使用する方がはるかに簡単であり、スペースのみのPEP-8の主張を理解していません。 Sublime Text 2は縦長の点線でオフホワイトのタブを視覚化するという点で素晴らしい仕事をしています。有害なこと。

1
gr33kbo1

私はタブが大好きですが、どういうわけか私が好きな他のルールと互換性がありません。

4つのスペースタブを選択して10個のタブを挿入すると、80桁の制限を満たすために40文字分のスペースが残ります。他のコーダが8つのスペースタブを好む場合、同じ行は120文字の長さで表示され、有効な80桁の行として表示されません。

80桁の制限を定義したい場合は、タブの長さを選択する必要があります。この場合、x個のスペースまたは長さxのタブがあっても、実際には違いはありません。

編集:関連するスレッド: スペースの代わりにタブを使用するときの最大行長を維持する?

1
Mathieu Villion

スペースを使用することの主な利点の1つは、選択エディタを超えてソースとやり取りする必要がある多数の外部ツールと、それを構成した設定を超えてソースコードがレンダリングされる方法のばらつきを取り除くことです。

いくつかの具体的な例として、 Visual Studio Code のツールチップ、または Beyond Compare または WinMerge のような差分ツールでのPythonドキュメント文字列のレンダリングを検討します。基本的にこれらの他のさまざまなインターフェースツールはそれぞれタブの解釈方法について異なる設定を持つことができ、ダイビングする可能性があるツールセットの中でまったく異なるものや画面からはみ出したものを見つけるのは邪魔になることがあります。の出入り。

一言で言えば、アーセナルの一連のツールを統一して構成するのではなく、ソースでアライメントを定義します。フォントは、サードパーティのタブレンダリングの実装/設定ではなく、フォントの定義により、固定幅フォント全体で信頼性の高い一貫した配置を提供するために、固定幅フォントで厳密に解釈されます。

これに対する別の角度は、タブ文字が不注意によるタブ補完を引き起こす可能性がある端末で実行するために主要なタブソースをコピーすることです。たとえば、次のPythonソースをコピーすると(タブはインデントとして使用されます)、

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

あなたは次のようなものを見るかもしれません(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)'

(余談:このツール間の一貫性の観察は、Stack Overflowに見られる給与の違いについてのヒントを示すかもしれない、世界を秩序化しようとしている鋭い開発者の識別力のある目印であるかどうか疑問に思いました。)

1
jxramos

タブキーを押すと、2つのスペースインデントと、タブの代わりにスペースを挿入するエディタ(kwrite)を使用します。

0
David Locke

スペースとタブが混在している既存のコードを最近扱わなければならなかったので、それは本当に混乱します。

ミキシングしているとき(実際にはすべきではありませんが、残念ながらそこには存在します)、 "1 tab == 1 indent level"は正しくないようです。

次の例を見てください(Python 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),)

ここでは、def add(...)の前に4つのスペース(1つの識別レベル)、self.total += xの前に8つのスペース(2つのインデントレベル)、そしてif self.total > 10の前に単一のタブがあります。

それでも、このコードが機能するため、その単一のタブは2つのインデントレベルのように動作します。反対に、すべてのタブを4つのスペース(単一のインデントレベル、つまりクラス内のdefがある場所)に置き換えると、returnブロック内には存在しなくなるため、defの前に予期しないインデントエラーが発生します。

これは本当にタブを4文字で表示するエディタと混同します。もちろんこれは設定可能ですが、設定が必ずしも容易ではない(あるいは可能ならばすぐに見えるようになる)ソースコードビューア(例えばGitHubのようなもの)にも影響します。

タブ対。スペースの振る舞いは常にエディタに依存します。

  • Tabキーを押すたびにエディタが自動的にスペースを挿入すると、適切な数のスペースが挿入され、別のエディタがまったく同じスタイルを表示します。
  • エディタでタブが使用されていない場合は、タブの代わりにスペースが使用されている行に気付かない可能性が常にあります(特に他のエディタがプロジェクトで使用されている場合)。

両方とも欠点があります。肝心なのは、タブとスペースの間で任意の選択がある必要があるということですが、それらが混在してはいけません。自分のコードが後でどのように読み取られて使用されるのかわからないので、すべてのpythonコーダーに影響を与えるような規約を持つのは良いことです。 PEP-8はスペースを言っています、そうです。

重要なのは Javaのやり方ではない

インデントの単位として4つのスペースを使用する必要があります。字下げの正確な構成(スペースとタブ)は指定されていません。タブは8スペースごとに設定する必要があります(4ではありません)。

はい。Javaの世界では1タブ= 2インデントレベルです。ありがたいことに、それはコンパイルに関しては同じ意味を持ちません。

0
Bruno

人々は同じコードで異なるエディタを使うでしょう。これらのエディタは、画面上のタブを異なる方法で表します。タブを4つのスペースで表すエディターで作業している場合、最初の行を"\t "で、2番目の行を"\t\t"でインデントすると、それらは同じインデントレベルである8スペースのように見えます。

Pythonインタプリタはあなたのエディタを知らないので、タブをある程度のインデントとして解釈しなければなりません。実際、タブは8個のスペースとして解釈されるので、意図したものとは異なるインデントレベルが表示されます。1行目に12スペース、2行目に16スペースです。あなたは焼かれています。

0

タブ側のよりわかりにくい(ある人には!)議論:私は、タブは視覚障害者のためのスクリーンリーダーでうまく機能すると言われています。

0
Peter Drake

私は最近、PEP 8準拠のためにタブからスペースに切り替えました。

私は以前タブを気に入っていた理由は2つあります。

  1. タブを使用すると、誰でも自分の好みのインデントレベルでコードを見ることができます。右側にスペース、左側にタブを使用するだけです。
  2. タブがかなりひどく欲しい

...しかし、私がPEP 8がどれほど重要になっているかを理解した後、私はとにかく切り替えました。私が見るように、タブの上のスペースの主な価値は単純さです - あなたが見るものはあなたが持っているものです。そしてPEP 8準拠。そして私は、Makefileのタブを残したまま、Pythonファイル用のスペースを有効にするというVimの規則を思いついた。

0
user1277476