Pythonインデントを修正する方法


264

一貫性のないインデントを持ついくつかのPythonコードがあります。問題をさらに悪化させるタブとスペースの混合がたくさんあり、スペースのインデントすら保持されません。

コードは期待どおりに機能しますが、維持するのは困難です。

コードを壊すことなくインデント(HTML TidyのようですがPythonの場合)を修正するにはどうすればよいですか?


あなたは、このリンクを見直し、reindent.py module--使用方法についてご入力を提供することができますstackoverflow.com/questions/12132481/installing-reindent-python/...を
user1050619

この関連の質問ではアンディ・ヘイデンの外観@によって後述するように-基本的にautopep8インデントなどがはるかに提供しています。stackoverflow.com/questions/14328406/...
Pierz

2
これはめちゃくちゃ便利な質問です。私はこれを頻繁に行う必要があることに気づきました。それは「ツールを推奨する」ことではなく、「それを行う方法」ではありません。
アンディヘイデン

回答:


282

Pythonインストールのディレクトリにあるreindent.pyスクリプトを使用しTools/scripts/ます。

Python(.py)ファイルを変更して、4スペースのインデントを使用し、ハードタブ文字を使用しないようにします。また、行の終わりから余分なスペースとタブを削除し、ファイルの終わりにある空の行を削除します。また、最後の行が改行で終わっていることを確認してください。

詳しい使用方法については、そのスクリプトをご覧ください。


51
残念ながら、これはDebianおよびUbuntuへの通常のPythonインストールの一部ではありません。python-examplesパッケージに分割されています。
ephemient 2009年

16
優れた!したがって、DebianとUbuntuのユーザーが行う必要があるのは、そのパッケージをapt-getすることだけです。または、スクリプトはsvn.python.org/view/python/trunk/Tools/scripts/…にもあります。
Alex Martelli、

9
@Shay Erlichmen:「python -tt yourscript.py」を試してください
nosklo

8
Fedora / RedHat / CentOSユーザーは、「python-tools」パッケージをインストールする必要があります。
クリスティアンCiupitu 2009年

26
ephemientのコメントに追加するだけpython-examplesです:がインストールされると、でreindentが見つかります/usr/share/doc/pythonX.X/examples/Tools/scripts/reindent.py
ラリーヘイスティングス

59

Vimを使用している場合は、を参照してください:h retab

                                                        *:ret * *:retab *
:[範囲] ret [ab] [!] [new_tabstop]
                        を含む空白のシーケンスをすべて置き換えます
                        <Tab>は、新しい空白文字列を使用して、新しい
                        与えられたタブストップ値。新規指定しない場合
                        タブストップサイズまたはゼロの場合、Vimは現在の値を使用します
                        「タブストップ」の。
                        「tabstop」の現在の値は常に
                        既存のタブの幅を計算します。
                        !を使用すると、Vimは通常の文字列のみを置き換えます
                        必要に応じてタブ付きのスペース。
                        「expandtab」をオンにすると、Vimはすべてのタブを
                        適切な数のスペース。
                        このコマンドは、「tabstop」を指定された新しい値に設定します。
                        そして、それがデフォルトであるファイル全体に対して実行された場合、
                        目に見える変化はないはずです。
                        注意:このコマンドは<Tab>文字を変更します
                        Cプログラムの文字列の内部。回避するには「\ t」を使用します
                        これ(とにかく良い習慣です)。
                        「:retab!」スペースのシーケンスを変更することもできます
                        <Tab>文字。printf()を混乱させる可能性があります。
                        {Viにはない}
                        | + ex_extra |の場合は使用できません で機能が無効になりました
                        コンパイル時間。

たとえば、単に次のように入力した場合

:ret

すべてのタブがスペースに展開されます。

あなたがしたいかもしれません

:se et ":set expandtabの省略形

新しい行がリテラルタブを使用しないようにします。


Vimを使用していない場合は、

perl -i.bak -pe "s / \ t / '' x(8-pos()%8)/ eg" file.py

タブが8文字ごとに停止すると想定して、タブをスペースに置き換えますfile.py(念のためfile.py.bak、元の文字列はに移動します)。タブストップが4スペースごとにある場合は、8を4に置き換えます。


2
うまくいきました。これは、タブのインデントの混同を修正する最も簡単な方法です。
Srikant 14年

確かに最も簡単な方法ではありません。
CONvid19

52

私はautopep8がこれを行うために到達します:

$ # see what changes it would make
$ autopep8 path/to/file.py --select=E101,E121 --diff

$ # make these changes
$ autopep8 path/to/file.py --select=E101,E121 --in-place

注:E101およびE121はpep8インデントです(--select=E1E1で始まるインデント関連のすべての問題を修正するために単純に合格できると思います)。

これは、再帰フラグを使用してプロジェクト全体に適用できます。

$ autopep8 package_dir --recursive --select=E101,E121 --in-place

PythonコードをPEP8準拠に変換するツールも参照してください。


これはすごい...私はルビーのpython用rubocopのようなツールを探していました
OkezieE

1
autopep8構文が正しくない場合は失敗します。あなたはそれを使用して確認できますpython -tt <file.py>
Nishant

47

autopep8 -i script.py

autopep8を使用する

autopep8 PEP 8 nullstyleガイドに準拠するようにPythonコードを自動的にフォーマットします。pep8ユーティリティを使用して、nullcodeフォーマットする必要のある部分を決定 します。autopep8nullformatting報告できる問題のほとんどを修正 できますpep8

pip install autopep8
autopep8 script.py    # print only
autopep8 -i script.py # write file

"import os"を含む行コードが1つだけあり、その前に4つのスペースがありますが、インデントされていません....理由は何
ですか

3
@pkm 4スペース(または4の倍数であるインデント)はPEP8の一部です
rbaleksandar

13

Vimを使用する場合Escは、を押してから入力する以上の操作は必要ありません。

:%s/\t/    /g

...変更するファイル。これにより、すべてのタブが4つのスペースに変換されます。間隔にもばらつきがある場合は、さらに難しくなります。


11
元のコーダーを追跡し、強化された質問技術を適用できますか?一貫性のないインデントされたコードよりも悪いことはありません。
ベンヒューズ

3
@ベン一貫性のないインデントは、その男からの問題の中で最も少ないものです:)
Shay Erlichmen '22 / 06/22

9

PythonTidyもあります(HTML Tidyが好きだと言っていたからです)。

ただし、タブをクリーンアップするだけではありません。そのようなものが好きなら、一見の価値があります。


5

ほとんどのUNIXライクなシステムでは、次のものも実行できます。

expand -t4 oldfilename.py > newfilename.py

タブを4以外のスペースに置き換える場合は、コマンドラインから番号を変更します。元のファイル名を保持したまま、一連のファイルを使用してこれを行うシェルスクリプトを簡単に作成できます。


1
同じファイルを使用しても機能せず、空のファイルが残ることに注意してください。この回答は実際に機能し、タブをスペースに変換する必要があるときに使用します。誰かが反対票を説明できますか?+1します。
S.カーデル2016

上書きされたファイルを回復する方法はありますか?上記の方法を使用しただけで、私の1日分のコードがfacepalmから消えました。ありがとう
Simas


4

一部のモジュールが欠落しているため、再インデントスクリプトは機能しませんでした。とにかく、私sedは仕事を完璧にするこのコマンドを見つけました:

sed -r 's/^([  ]*)([^ ])/\1\1\2/' file.py

2
不正なオプション-r。
HelloWorld 2017年

2

Emacsを試してください。Pythonで必要なインデントをサポートしています。このリンクを確認してくださいhttp://python.about.com/b/2007/09/24/emacs-tips-for-python-programmers.htm


2
python-modeはPythonの記述に適していますが、リンクには既存のファイルのインデントを修正する方法は記載されていません。
ephemient 2009年

5
Mx untabifyはemacsでタブをスペースに変換します
Paul Hildebrandt

リンクは(事実上)切断されています。「Cプログラミング言語for Beginners」(!)というタイトルのページにリダイレクトします。
Peter Mortensen


0

この問題の簡単な解決策があります。最初に「:retab」と入力してから「:retab!」と入力すると、すべてうまくいきます


1
:retabどのコンテキストで「」と入力します。ではVimの
Peter Mortensen

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.