「インデントにおけるタブとスペースの一貫性のない使用」


218

私はPython 3.2でアプリケーションを作成しようとしていますが、インデントには常にタブを使用していますが、エディターでさえそれらの一部をスペースに変更し、実行しようとすると「一貫性のないタブとスペースの使用のインデント」を出力しますプログラム。

スペースをタブに変更するにはどうすればよいですか?それは私を夢中にさせています。(私はプログラミングの初心者です)。コードに関する全体的なヒントを教えていただければ幸いです。多くの間違いを犯した場合は、喜んでお聞かせいただけます。

import random

attraktioner = ["frittfall","bergodalbana","spökhuset"]


class Nojesfalt:
    def __init__(self, attraktion):
        self.val = attraktion
        self.langd = 0
        self.alder = 0


#längdgräns för fritt fall
    def langdgrans(self):
        print("")
        self.langd = int(input("Hur lång är du i cm? "))
        if self.langd < 140:
            print("tyvärr, du är för kort, prova något annat")
            return 0
        elif self.langd >= 140:
            print("håll dig hatten, nu åker vi!")
            print(" ")
            return 1

#åldersgräns för spökhuset
    def aldersgrans(self):
        print("")
        self.alder = int(input("Hur gammal är du? "))
        if self.alder < 10:
            print("tyvärr, du är för ung, prova något annat")
            return 0
        elif self.alder >= 10:
            print("Gå in om du törs!")
            print(" ")
            return 1


#åker attraktion frittfall lr bergodalbana
        def aka(self):
                print("")
        print(self.val)
        tal = random.randint(0,100)
        if tal < 20:
            print("åkturen gick åt skogen, bättre lycka nästa gång")
        elif tal >= 20:
            print("jabbadabbbadoooooooo")
            return 1

#går i spökhuset
        def aka1(self):
                print("")
        print(self.val)
        tal = random.randint(0,100)
        if tal < 20:
            print("du är omringad av spöken och kan inte fortsätta")            return 0
        elif tal >= 20:
            print("Buhuuuuuu, buuuhuuuu")
            return 1

#programkod
print("Välkommen till nöjesfältet, vad vill du göra?")
print(" ")

while 1:
    vald_attr = input("Vad vill du göra?\n1. frittfall\n2. bergodalbana\n3. spökhuset\n4. Avsluta\n")
    if vald_attr == "1":
        val = Nojesfalt(attraktioner[0])
        if val.langdgrans() == 1:
            val.aka()
    elif vald_attr == "2":
        val = Nojesfalt(attraktioner[1])
        val.aka()
    elif vald_attr == "3":
        val = Nojesfalt(attraktioner[2])
        if val.aldersgrans() == 1:
            val.aka1()
    elif vald_attr == "4":
        break

25
これは、実際のP​​ythonではなく、コードエディタの問題です。それを反映するように質問を変更し、使用しているエディターについて言及する必要があります。
ジェフメルカード

3
これをどのように変更するかは、エディターによって異なります。これがここでも話題になっているとは思いませんが、スーパーユーザーにとっては疑問かもしれません。
Lennart Regebro、2011

エディターを変更して、行の先頭に表示される空白を表示します。たとえば、コードをインデントするためにタブを使用しているため、透明なタブと可視スペースを表示するようにエディターを構成しました。行の先頭でノイズが見られる場合は、1つ以上の余分なスペースがあることがわかります。間違った方法でそれを主張する場合は、スペースを非表示にしてタブを表示するようにエディターを構成できます。(ええ、私はPEP-8について知っていますが、それには同意しません。)
ミッコランタライネン

回答:


273

タブを使用しないでください。

  1. インデントに4つのスペースを使用するようにエディターを設定します。
  2. 検索を実行して、すべてのタブを4つのスペースに置き換えます。
  3. エディタがタブを8つのスペースとして表示するように設定されていることを確認してください。

注:タブに8つのスペースを使用する理由は、スペースではなくタブを使用するサンプルコードからコピーして貼り付ける場合など、意図せずにタブが挿入された場合にすぐに気付くためです。


7
これらの教義の背後に何か理由はありますか?
RocketR 2011

1
@Lennart Regebro、私はスペースをまったく使用することを意味します。私はそれらを使用しますが、無意識のうちに、タブは私にとってより良いようです。ちなみに、Rubyプログラミングでは、誰もが2つのスペースを使用するため、すべての人に単一のルールはありません。
RocketR 2011

3
@RocketR:答えはPythonです。タブのみを使用する場合、タブを8スペース以外に展開しない限り、8スペースのインデントになります。その場合、他のエディターでは見栄えが悪くなります。タブとスペースを混在させると、8スペース以外のタブの拡張がある場合、タブが壊れるか(質問を参照)、壊れて見えることがあります。要約すると、インデントにタブを使用することは非常に悪いことです。これを絶対に行わないでください(それを必要とする言語/ファイル形式を除く)。終わり。
Lennart Regebro

2
@RocketR PythonにはPep8があります。これは、4つのスペースがインデントで受け入れられるフォームであることを明示的に述べた「優れたPythonスタイル」をリストしたドキュメントです。
Daniel Gratzer 2013

4
「タブ対スペース」スポイラーの関連するPEP 8セクションへのリンク:最初の行は「スペースは優先インデント方法です」です。
Tadhg McDonald-Jensen


43

ではIDLEエディタあなたはこれを使用することができます。

  • メニュー編集すべて選択
  • メニュー形式領域のタブ解除
  • エディターが8つのスペースをタブに置き換えたと想定して、入力ボックスに8を入力します。
  • 選択を押すと、ドキュメント全体が修正されます。

15

Python開発にSublime Textを使用している場合は、Anacondaパッケージを使用することでエラーを回避できます。Anacondaをインストールした後、Sublime Textでファイルを開き、空いているスペースで右クリック→ Anacondaを選択→autoformatをクリックします。完了しました。またはCtrl+ Alt+を押しRます。


12

一般的に、人々はスペースでインデントすることを好みます。エディター間でより一貫性があり、この種の不一致が少なくなります。ただし、タブでインデントすることができます。それはあなたの選択です。ただし、タブごとに8スペースという標準は少し広いことに注意してください。

あなたの問題に関しては、おそらくあなたの編集者がめちゃくちゃになっています。タブをスペースに変換することは、エディターに依存します。

たとえばEmacsでは、メソッド 'untabify'を呼び出すことができます。

コマンドラインでは、sed行を使用できます(スペースの数を自由に調整してください)。

   sed -e 's;\t;       ;' < yourFile.py > yourNedFile.py

9

崇高なテキストエディターを使用しているとき、inconsistent use of tabs and spaces in indentationエラーが発生しているコードのセグメントを選択して、以下を選択できました。

view > indentation > convert indentation to spaces

これで問題が解決しました。


8

同じエラーがポップアップしたときに私がしたこと:すべてを選択し(Str+ A)、Shift+ を押しTabます。したがって、もう何もインデントされていません。インデントしたい行に戻り、好きなように戻します。

それは私のために働いた...


7

私は最近同じ問題を抱えていましたが、.pyファイルの文字セットをUTF-8に変換するだけでよいことがわかりました。これは、Python 3が使用するセットであるためです。

ところで、私は4スペースのタブをいつも使っていたので、問題はそれらによって引き起こされたのではありません。


6

崇高なテキスト3

崇高なテキストで、WHILE 編集Pythonのファイルを:

Sublime Textメニュー > Preferences > Settings-Syntax Specific

Python.sublime-settings

{
    "tab_size": 4,
    "translate_tabs_to_spaces": true
}

5

この問題を解決するにはnotepad++Tabsを4 Space秒に置き換えます。

  1. [検索]-> [検索...]を選択するか、Ctrl+を押しますF
  2. [ 置換 ]タブを選択します
  3. [名前]ボックスに検索モードを選択(\ nは、\ R、\トン、\ 0、\ X ...)拡張
  4. フィールドに:どのような検索の書き込み\トン
  5. [ 置換後のフィールド]で、をSpace4回押します。このフィールドには他に何もないことを確認してください。
  6. すべて置換ボタンをクリックします

タブをスペースに置き換える方法


3

私はこの問題を抱えていました。解決策:問題のある行の前の「タブ」は、スペース、4、6、または8スペースです。それらを消去して、TABを挿入する必要があります。'\ t'。それで全部です。


PythonでコーディングするときにTAB文字を使用することはお勧めしません-PEP008(python.org/dev/peps/pep-0008)を読んでください
Tony Suffolk 66

2

Notepad ++を使用してこのエラーが発生しました。

Notepad ++では、タブと4つのスペースの両方が同じであることがわかりますが、コードをPython IDLEにコピーすると違いがわかり、タブのある行の前には他のスペースよりも多くのスペースがあります。

この問題を解決するために、行の前にタブを削除してから4つのスペースを追加しました。


2

同じエラーが発生しました。既存の* .pyファイルにいくつかのコード行を追加する必要がありました。Notepad ++では機能しませんでした。

コード行を追加して保存した後、同じエラーが発生しました。同じファイルをPyCharmで開いて行を追加すると、エラーが消えました。


1

同じエラーが発生しましたが、何が間違っているのか理解できませんでした。

そこで、コードで自動インデントを実行し、マシンが私の障害を修正できるようにして、問題を修正しました。

誰かがどうやって私がそうしたのかと思っているなら。シンプル。vimに移動します。G = ggと入力します。

これにより、すべてが自動的に修正されます。幸運を :)


1

あなたの問題はあなたのエディタの制限/設定によるものです。一部のエディターは、次の方法で問題を解決するためのツールを提供します。

  1. タブをスペースに変換する

    たとえば、StaniのPythonエディターを使用している場合は、保存時にそれを実行するように構成できます。

  2. スペースをタブに変換する

ActiveState Komodoを使用している場合は、コードを「タブ化」するツールがあります。他の人がすでに指摘したように、これは良い考えではありません。

EclipseのPydevは、「タブをスペースタブに変換する」および「スペースタブをタブに変換する」機能を提供します。


1

(SciTEのように)検索と置換を行うときにエディターがタブを認識しない場合は、コードをWordに貼り付け、Ctr-Hと^ tを使用して検索し、タブを見つけて4つのスペースで置き換えることができます。


1

ここからこの質問の重複がありましたが、私は現代のエディターとそれらが提供する膨大な数の機能を使用するための見解を提供すると思いました。Pythonコードでは、.pyファイル内で意図する必要があるものはすべて、タブキーを使用するか、スペースで意図する必要があります。慣例では、インデントに4つのスペースを使用します。ほとんどのエディターには、コードがスペースまたはタブでインデントされているかどうかをエディターで視覚的に表示する機能があり、デバッグに非常に役立ちます。たとえば、atomを使用して設定に移動し、次にエディターに移動すると、次の2つのオプションが表示されます。

タブとスペースを表示する原子エディター

次に、コードでスペースを使用している場合、コードがインデントされている場所に小さなドットが表示されます。

ここに画像の説明を入力してください

また、タブを使用してインデントされている場合は、次のようになります。

ここに画像の説明を入力してください

今気づいたら、タブを使用すると左側にエラー/警告が多く表示されます。これは、基本的にPythonの統一されたスタイルガイドである、pep8 pep8 documentationと呼ばれるものによるため、すべての開発者が主に他の人々のコードを理解しようとするときに役立つ同じ標準と外観は、タブではなくスペースを使用してインデントすることを好むpep8にあります。そして、pep8警告コードに関連する警告があることを示すエディターを見ることができますW191

上記のすべてが、あなたが抱えている問題の性質と、将来的にそれを防ぐ方法を理解するのに役立つことを願っています。


0

時々、tabインデント中にめちゃくちゃになります。一つの方法は明らかに使用することですtabし、backspaceコードを正しくインデントします。

もう1つの方法は、space 4回使用することです(インデントする量に応じて)。

他に何も機能しないときに機能する奇妙な方法です。エラーが発生backspacedした行は、その行を前の行に移動してを押しましたenter。自動的に行がインデントされて正しい位置になり、その後はエラーになりませんでした。

うまくいけば、これは役立つはずです。


0

同じ問題があり、次のpythonスクリプトを使用して修正しました。それが他の人を助けることを願っています。

これは、コードのインデントにタブとスペースを使用しているためです。このスクリプトでは、各タブを4つのスペースに置き換えています。

input_file = "source code path here"  # e.g. source.py
output_file = "out put file path here"  # e.g out.py
with open(input_file, 'r') as source:
    with open(output_file, 'a+') as result:
        for line in source:
            line = line.replace('\t', '    ')
            result.write(line)

テキストを置き換えるツールを提供する崇高なまたは他のエディタを使用する場合、エディタからすべてのタブを4つのスペースで置き換えることができます。


0

Pythonの場合はIdle、python3の場合はIdle3を使用します。


2
これがどのように/なぜ機能するのかについて少し詳しく説明しておくと役に立ちます。
Taslim Oseni

問題は、領域内のスペースではなくタブが原因です。Idleは領域全体をタブ化解除して問題を修正できます(メニュー形式から[Untabify]を選択するだけです)。
simc

0

Vimエディターを使用してこれを解決する

  1. ターミナルを開きます(Ctrl+ Alt+ T)。
  2. ファイルがあるディレクトリに移動します(cd <path_to_your_directory>)。例:cd /home/vineeshvs/work
  3. Vimでファイルを開きます(vim <file_name>)。例:vim myfile.txt
  4. [オプションの手順] Vimで検索キーワードの強調表示を有効にする(ESC :set hlsearch
  5. この問題が発生している行に移動します(ESC :<line_number>)。例:ボタンを1回:53押した後のVimエディターESC
  6. Vimで必要な数のスペースを使用してタブを置き換えます(:.,$s/\t/<give_as_many_spaces_as_you_want_to_replace_tab>/gc)。例:タブは、次のコマンドを使用して4つのスペースに置き換えられ ます:ボタンを1回:.,$s/\t/ /gc押した後ESC)。このプロセスはインタラクティブです。あなたは与える可能性がありy、スペースとタブを交換するとn、特定の交換をスキップします。ESC必要な交換が完了したらを押します。

0

奇妙なことに、.pyファイルの1つで同様の問題が発生しました。私は単にPycharmでファイルを開いてOption+ Command+ Lを押すだけで、ファイルの内容が一度に正しくフォーマットされます。

私は通常の崇高なテキストまたはPycharmの選択とは対照的に、この特定の.pyファイルをjupyterラボでコーディングしたため、問題が発生したと思います。


0

さて、私は同じ問題を抱えていましたが、問題は別のpythonエディターから崇高にコードをコピーしたことであることに気付きました。

私はjupyter Notebookを使用していて、コードを崇高にコピーしました。どうやら特定の変更(関数内のコードの移動など)を行うと、インデントが乱雑になり、これが問題の原因です。

したがって、1つのエディターのみを使用してください。そうすれば、問題はありません。




0

インデントを削除してから、体系的にタブまたはスペースを4回押します。これは通常、タブキーを使用してインデントを設定し、次の行でスペースキーを使用すると発生します。


-2

インデントされたビットをハイライトし、タブをクリックします。その後、それらは一貫します:)


2
これは、4つのスペースを推奨する正規のPythonスタイルガイドであるPEP 8と競合します。タブを使用するように人々に助言することは、より一貫性がありません。
Aurora0001 16

言うまでもなく、PEP8を使用しているこのコードの共同編集者が同じエラーに遭遇した場合
Thomas Matthew
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.