127

Python コードが PEP8 に準拠しているかどうかを検証するツールがあることは知っています。たとえば、オンライン サービスpython モジュールの両方があります。

しかし、 Python ファイルを自己完結型の PEP8 有効な Python ファイルに変換できるサービスまたはモジュールが見つかりません。あるかどうか知っている人はいますか?
PEP8 はコードの外観がすべてなので、実現可能だと思いますよね?

4

6 に答える 6

202

autopep8を使用できます!自分でコーヒーを淹れる間、このツールはコードの意味を変えない厄介なPEP8違反をすべて喜んで取り除きます。

pip経由でインストールします。

pip install autopep8

これを特定のファイルに適用します。

autopep8 py_file --in-place

またはプロジェクトに(再帰的に)、冗長オプションを使用すると、プロジェクトの進行状況に関するフィードバックが得られます

autopep8 project_dir --recursive --in-place --pep8-passes 2000 --verbose

注:デフォルトの100パスでは不十分な場合があります。これは、適度に高く、最も厄介なファイルを除くすべてをキャッチするため、2000に設定します(解決可能なpep8違反が見つからなくなるとパスを停止します)...

この時点で、再テストしてコミットすることをお勧めします。

「完全な」 PEP8準拠が必要な場合:私が使用した1つの戦術は、上記のようにautopep8を実行してから、残りの違反(ファイル、行番号など)を出力するPEP8を実行することです。

pep8 project_dir --ignore=E501

これらを個別に手動で変更します(例:E712-ブール値との比較)。

注:autopep8は--aggressive引数を提供します(これらの意味を変える違反を容赦なく「修正」するため)が、積極的に使用する場合はデバッグする必要があるかもしれないことに注意してください...(たとえば、numpy / pandasTrue == np.bool_(True)ではありませんTrue is np.bool_(True)!)

各タイプの違反の数(前後)を確認できます。

pep8 --quiet --statistics .

注:E501(行が長すぎる)は特殊なケースであると思います。コードにこれらが多数含まれている可能性があり、autopep8で修正されない場合があるためです。

例として、この手法をパンダのコードベースに適用しました。

于 2013-01-14T23:09:23.140 に答える
41

残念ながら、「pep8 ストーミング」(プロジェクト全体) には、いくつかのマイナスの副作用があります。

  • 多くのマージ競合
  • git のせいにする
  • コードレビューを難しくする

別の方法として (アイデアを提供してくれた @yp に感謝します)、最後のコミット/ブランチ以降に作業している行のみを autopep8 する小さなパッケージを作成しました。

基本的に、プロジェクト を見つけたよりも少し良くします

pip install pep8radius

作業masterが完了し、コミットする準備ができたとします。

# be somewhere in your project directory
# see the diff with pep, see the changes you've made since master
pep8radius master --diff
# make those changes
pep8radius master --diff --in-place

または、最後のコミット以降にコミットした新しい行を消去するには:

pep8radius --diff
pep8radius --diff --in-place

# the lines which changed since a specific commit `git diff 98f51f`
pep8radius 98f51f --diff

基本的pep8radiusに、git/hg diff の出力の行に autopep8 を適用しています (最後の共有コミットから)。

このスクリプトは現在、git と hg で動作します。他のものを使用していて、これを動作させたい場合は、コメント/問題/PR を投稿してください

于 2014-03-26T08:38:10.257 に答える
8

@Andy Hayden は、autopep8 の概要を説明しました。それに加えて、同じことを行うpep8ifyというパッケージがもう 1 つあります。

ただし、どちらのパッケージもリント エラーのみを削除できますが、コードをフォーマットすることはできません。

little = more[3:   5]

上記のコードは、pep8ifying 後も同じままです。しかし、コードはまだ見栄えがよくありません。コードが PEP8 に準拠していても、コードをフォーマットするyapfなどのフォーマッターを使用できます。上記のコードは次のようにフォーマットされます

little = more[3:5]

場合によっては、これにより手動のフォーマットが破壊されることさえあります。例えば

BAZ = {
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]
}

に変換されます

BAZ = {[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]}

しかし、いくつかの部分を無視するように指示できます。

BAZ = {
   [1, 2, 3, 4],
   [5, 6, 7, 8],
   [9, 10, 11, 12]
}  # yapf: disable

私の古いブログ投稿から引用:自動的に PEP8 & Format Your Python Code!

于 2015-05-26T14:11:24.607 に答える