web-dev-qa-db-ja.com

なぜPython pep-8はインデントのためにタブよりもスペースを強く推奨しますか?

スタックオーバーフローと PEP 8 で、Pythonプログラムのインデントにのみスペースを使用することを推奨しています。一貫したインデントの必要性を理解でき、私は感じました。その痛み。

スペースが優先される根本的な理由はありますか?タブはずっと使いやすいと思っていただろう。

135
quamrana

答えはPEPですぐに出されました[編集:この文章は 201 で編集されました]。私は引用する:

最も一般的なインデントの方法Pythonはスペースのみです。

他にどのような理由が必要ですか?

簡潔に言うと、最初の段落で述べたように、PEPの範囲も考慮してください。

このドキュメントでは、メインのPythonディストリビューションの標準ライブラリを構成するPythonコードのコーディング規約を示します。

公式のpython distribution一貫してフォーマットされたすべてのコードを作成することを意図しています™)。

個々のプログラマーのスペースとタブの決定は、a)本当に好みの問題であり、b)技術的な手段(エディター、変換スクリプトなど)で簡単に対処できるため、すべての議論を終了する明確な方法があります。 。

Guidoを選択しました。彼は理由を述べる必要さえありませんでしたが、彼はまだ経験的データを参照することでそれをしました。

他のすべての目的のために、このPEPを推奨事項として使用するか、それを無視することができます(選択、チーム、またはチームリーダー)。

しかし、私があなたに1つのアドバイスを与えるかもしれないならば:それらを混ぜないでください;-) [ed:タブとスペースを混ぜることはもはやオプションではありません。]

102
user3850

まあ、誰もがスペースに強く偏っているようです。タブのみを使用します。理由はよくわかります。

タブは実際にはクールな発明であり、それはafterスペースです。スペースを何百万回も押したり、偽のタブ(スペースを生成する)を使用したりせずにインデントできます。

誰もがタブの使用を差別している理由が本当にわかりません。これは、高齢者が若い人をより効率的な新しい技術を選択し、パルスダイヤルがすべての電話で機能するという不満をこれらの派手な新しい機能だけでなく使用することで差別していることによく似ています。 「トーンダイヤルはすべての電話で機能するわけではありません。それが間違っている理由です」。

エディターはタブを適切に処理できませんか?さて、modernエディターを入手してください。私たちは21世紀になりました。編集者がハイテクの複雑なソフトウェアであった時代は昔です。現在、選択できるエディタは数え切れないほどありますが、どれもタブをうまくサポートしています。また、タブの大きさを定義することもできます。これはスペースではできません。タブが表示されませんか?引数については何ですか?まあ、あなたもスペースを見ることができません!

より良いエディターを手に入れるために大胆に提案してもいいですか?すでに10年ほど前にリリースされたこれらのハイテク製品の1つである表示されない文字を表示する? (皮肉オフ)

スペースを使用すると、より多くの削除およびフォーマット作業が発生します。 (そして、これを知っており、私に同意する他のすべての人々)がPythonのタブを使用する理由です。

タブとスペースを混在させることは、それについての議論ではありません。それは混乱であり、決して機能しません。

84
nigratruo

個人的に、タブ上のスペースには同意しません。私にとって、タブはドキュメントレイアウトの文字/メカニズムですが、スペースはコードの場合のコンテンツまたはコマンド間の線引きです。

タブは実際には問題ではなく、人々とタブとスペースをどのように組み合わせたいかというジムのコメントに同意する必要があります。

とはいえ、慣習のためにスペースを使用するように強制しました。個人的な好みよりも一貫性を重視しています。

39
Soviut

スペースの理由は、タブがオプションであるためです。スペースは、句読点の実際の最小公分母です。

適切なテキストエディタにはすべて「タブをスペースに置き換える」機能があり、多くの人がこれを使用しています。しかしいつもではない。

一部のテキストエディタでは、一連のスペースをタブに置き換えることができますが、これは非常にまれです。

ボトムライン。スペースを間違えることはありません。あなたはmightタブでうまくいかない。そのため、タブを使用せず、間違いのリスクを減らします。

29
S.Lott

タブの問題は、それらが目に見えないことであり、人々はタブの幅に同意できないことです。タブとスペースを混在させて、Python(8スペースごとにタブストップを使用する)以外の場所にタブストップを設定すると、Pythonとは異なるレイアウトでコードが表示されます。 。また、レイアウトによってブロックが決定されるため、異なるロジックが表示されます。微妙なバグにつながります。

PEP 8を無視し、タブを使用すること、またはさらに悪いことにタブとスペースを混在させることを主張する場合、少なくとも常にpythonを '-tt'引数で実行します。これによりinconsistentになります。インデント(タブ、場合によっては同じインデントレベルのスペース)エラー。また、可能であれば、タブを異なる方法で表示するようにエディターを設定します。しかし、実際には、タブ、ピリオドを使用しないことが最善のアプローチです。

25
Thomas Wouters

インデントの主な問題は、タブとスペースを混在させるときに発生します。明らかにこれはあなたがどちらを選ぶべきかを教えてくれませんが、コインをひっくり返して選んだとしても、それを推薦するのは良い理由です。

しかし、私見では、タブよりもスペースを優先するいくつかの小さな理由があります。

  • さまざまなツール。コードがプログラマのエディタの外に表示される場合があります。例えば。ニュースグループまたはフォーラムに投稿されました。通常、スペースはタブよりも優れています。スペースはどこでも変形しますが、タブも同様に機能しますが、その逆はできません。

  • プログラマーはソースを異なって見ます。これは非常に主観的です-タブの主な利点、またはタブを使用する側に応じてタブを回避する理由のいずれかです。プラス面では、開発者は好みのインデントでソースを表示できるため、2スペースのインデントを好む開発者は同じソースで8スペースの開発者と連携して、好きなように表示できます。欠点は、これに影響があることです-ネストが深すぎるという非常に目に見えるフィードバックを与えるため、8スペースが好きな人もいます-エディターで絶えずラップしている2インデンターによってチェックインされたコードが表示される場合があります。すべての開発者に同じ方法でコードを表示させると、行の長さなどの一貫性が高まります。

  • 行のインデントを継続します。場合によっては、行をインデントして、前の行から搬送されたことを示したいことがあります。例えば。

    def foo():
        x = some_function_with_lots_of_args(foo, bar, baz,
                                            xyzzy, blah)
    

    タブを使用する場合、スペースとタブを混在させずにエディターで異なるタブストップを使用しているユーザーにこれを合わせる方法はありません。これにより、上記の利点が効果的に失われます。

ただし、これは明らかに宗教的な問題であり、プログラミングに問題があります。最も重要な問題は、私たちが1つを選択する必要があるということです。時々、重要なインデントの最大の利点は、少なくともブレース配置フレームワークを免れることだと思います。

this この問題に関するJamie Zawinskiの記事も読む価値があります。

22
Brian

タブを使用すると、PEP 8の別の側面が混乱することに注意してください。

すべての行を最大79文字に制限します。

仮に、2のタブ幅を使用し、8のタブ幅を使用するとします。最も長い行が79文字に達するようにすべてのコードを記述してから、ファイルの作業を開始します。今、私は読みにくいコードを持っています(PEPが述べているように):

ほとんどのツールのデフォルトのラッピングは、コードの視覚的構造を混乱させます

私たち全員が4つのスペースを使用する場合、それは常に同じです。エディターが80文字幅をサポートできるユーザーは、コードを快適に読むことができます。 注:80文字の制限はそれ自体が聖戦なので、ここから始めないでください。

不愉快なエディターには、タブのようにスペースを使用するオプション(挿入と削除の両方)が必要です。そのため、実際には有効な引数にはなりません。

10
Thane Brimhall

質問に対する答えは次のとおりです。PEP-8は推奨事項を作成したいと考えており、スペースがより人気があるため、タブよりもスペースを強く推奨することを決定しました。


PEP-8に関する注意

PEP-8は 'インデントレベルごとに4つのスペースを使用します。'
これが標準的な推奨事項であることは明らかです。

'混乱したくない本当に古いコードについては、8スペースのタブを使い続けることができます。'
タブを使用できる状況がいくつかあることは明らかです。

'タブとスペースを混在させないでください'
これはミキシングの明確な禁止です-私たち全員がこれに同意すると思います。 Pythonはこれを検出でき、しばしばチョークします。-tt引数を使用すると、これは明示的なエラーになります。

'インデントの最も一般的な方法Pythonはスペースのみです。2番目に人気のある方法はタブのみです。'
これは、両方が使用されていることを明確に示しています。非常に明確にするために、同じファイルにスペースとタブを混在させないでください。

'新しいプロジェクトでは、タブよりもスペースのみを強くお勧めします。'
これは明確な推奨事項であり、強力な推奨事項ですが、タブの禁止ではありません。


PEP-8で自分の質問に対する良い答えが見つかりません。私は、他の言語で歴史的に使用してきたタブを使用します。 Pythonタブを排他的に使用するソースを受け入れます。それで十分です。

私はスペースでの作業に行くと思いました。エディターで、スペースを排他的に使用するようにファイルタイプを構成したため、Tabキーを押すと4つのスペースが挿入されます。 Tabキーを何度も押すと、スペースを削除する必要があります。 Arrgh!タブの4倍の削除!私の編集者は、インデントに4つのスペースを使用していることを知ることができません(ANエディターはこれを行うことができるかもしれませんが)、明らかにスペースを1つずつ削除することを主張します。

Pythonインデントを読み取るときにタブをnスペースと見なすように言われましたか?インデントごとに4スペースとタブごとに4スペースに同意し、Pythonこれを受け入れれば、問題はありません。
Win-Winの問題解決策を見つける必要があります。

7
quamrana

コードでは常にタブを使用しています。そうは言っても、最近スペースを使用する理由を見つけました。NokiaN900インターネットタブレットで開発するとき、タブキーのないキーボードができました。これにより、タブをコピーして貼り付けるか、スペースでコードを書き直す必要がありました。他の電話でも同じ問題に遭遇しました。確かに、これはPythonの標準的な使用法ではなく、覚えておくべきことです。

3
Skyler

JWZが一番いいと言っています

[人々]がコードを読み、新しいコードを書き終えたら、新しいスコープ(またはsexprなど)が開いたときにコードがインデントする傾向がある画面列の数を気にします...

...私の意見では、技術的な問題を解決する最善の方法はASCII#9 TAB文字がディスクファイルに表示されないようにすることです:TABを適切な数に拡張するようにエディターをプログラムします行をディスクに書き込む前のスペース...

...これは、文字列定数や文字定数など、実際に重要な場所でタブを使用しないことを前提としていますが、私はそれを行いません:タブであることが重要な場合は、代わりに常に '\ t'を使用します。

2
Mark Cidade

pythonはプログラム構造を認識するためにインデントに依存しているため、IDを識別する明確な方法が必要です。これがスペースまたはタブを選択する理由です。

ただし、pythonも物事を行う方法が1つしかないという強い哲学を持っているため、インデントを行う方法の1つについて公式の推奨事項があるはずです。

スペースとタブの両方は、エディターがインデントとして処理するための独自の課題をもたらします。タブ自体の処理は、エディター間またはユーザー設定全体で均一ではありません。スペースは構成できないため、結果がどこでも同じように見えることを保証するため、より論理的な選択が可能になります。

1
Florian Bösch

ケーキを食べて食べることができます。タブをスペースに自動的に展開するようにエディターを設定します。

(それは:set expandtab Vimで。)

0

私の推測では、ほとんどのLinuxテキストエディターは、デフォルトでデフォルトがとてつもなく大きく見えるようになっています。タブの上にスペースを使用する他の理由は考えられません。

0
brian cronrath

タブよりもスペースについて言える最も重要な利点は、多くのプログラマーやプロジェクトがソースコードに設定された数の列を使用し、誰かがタブストップを2スペースに設定して変更をコミットし、プロジェクトがタブストップの長い行は、他の人のエディターウィンドウには長すぎます。タブの操作は簡単ですが、スペースはコラボレーションの方が簡単だと思います。これは、Pythonのような大規模なオープンソースプロジェクトでは重要です。

0
sirwart