web-dev-qa-db-ja.com

PythonコードをPEP8準拠に変換するツール

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

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

102
Chen Xie

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

  • 多数のマージ競合
  • gitの非難を破る
  • コードレビューを困難にする

別の方法として(そして @ y-p for idea のおかげで)、最後のコミット/ブランチ以降に作業していた行のみを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を適用しています( the last shared commit )。

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

35
Andy Hayden

autopep8 !を使用できます。自分でコーヒーを飲みながら、このツールはコードのmeaningを変更しない厄介なPEP8違反をすべて削除します。

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

pip install autopep8

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

autopep8 py_file --in-place

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

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

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

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

必要に応じて "full"PEP8への準拠:私が使用した戦術の1つは、上記のようにautopep8を実行し、PEP8を実行して残りの違反(ファイル、行番号、および何):

pep8 project_dir --ignore=E501

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

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

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

pep8 --quiet --statistics .

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

例として、I これを適用pandas コードベースへのテクニック。

171
Andy Hayden

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

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

little = more[3:   5]

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

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&Pythonコードをフォーマット!

8
ChillarAnand

Eclipse + PyDevを使用している場合、PyDevの設定からautopep8をアクティブにできます。Windows-> Preferences->検索フィルターに「autopep8」と入力します。

「コードのフォーマットにautopep8.pyを使用しますか?」 -> OK

これで、EclipseのCTRL-SHIFT-Fコードフォーマットはautopep8を使用してコードをフォーマットするはずです:)

screen shot

3
mork

沢山あります。

IDEには通常、いくつかのフォーマット機能が組み込まれています。IntelliJIdea/PyCharmには、EclipseのPythonプラグインなども含まれます。

複数の言語をターゲットにできるフォーマッター/リンターがあります。 https://coala.io はそれらの良い例です。

次に、単一の目的のツールがあり、その多くは他の回答で言及されています。

自動再フォーマットの特定の方法の1つは、ファイルをASTツリーに(コメントを削除せずに)解析し、それをテキストにダンプすることです(元のフォーマットが保持されないことを意味します)。その例は https://github.com/python/black です。

1
user7610