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


113

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

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


1
コードをPEP8互換コードに変換するツールはないと思います。PEP8には変数の命名規則も含まれているため、そのようなツールが存在する場合、変数名も変更され、独自のコードを理解できなくなる可能性があります。
Ashwini Chaudhary 2013年

1
@AshwiniChaudharyそれは良い点です。変数名を変更すると、すでにコードを使用している他の人に影響を与える可能性があることにも言及する価値があります。(autopep8はこれを行いません。)
Andy Hayden

回答:


38

残念ながら、 "pep8 storming"(プロジェクト全体)には、いくつかの悪影響があります。

  • たくさんのマージ競合
  • 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の出力(最後の共有commitから)の行にautopep8を適用します。

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


2
+1非常に良いイニシアチブ...同じ目的でNotepad ++プラグインを作成する方法について考えています...それはWindowsで私のお気に入りのエディターなので
kmonsoor

1
@kmonsoor良いアイデア、私はエディタプラグインについて考えていませんでした!githubで、CLIの外で支援/使いやすくする方法を教えてください...いくつかの(解決可能な)問題を予測しています。
アンディヘイデン

ここで私はエディタプラグインgithub.com/jcrocholl/pep8/wiki/RelatedToolsの興味深いリストを見つけましたが、Notepad ++には運がありません...
kmonsoor

1
別のプラグイン「Pythonスクリプト」に基づいて、Notepad ++とAutopep8の間を橋渡しするスクリプトを作成しました。ただし、機能します。Plzはここを確認してください:bit.ly/pep8_tonizer
kmonsoor

184

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

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

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

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

pep8 --quiet --statistics .

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

例として、私はこのテクニックをパンダのコードベースに適用しました。


@haydenこれがどれほど信頼できるか、そしてそれがもたらす奇妙な問題に対するオートマジックの修正の比率について何かコメントはありますか?
マリウス

@Marius私はこれをpandasコード(かなり大きい)で使用しましたが、奇妙な問題は表示されませんでした。意味を変更するコードは変更されません。これらに言及するように回答を更新しました。以前はSphinxのハッシュバングに問題がありました(PEP8のバグが修正されました)。
アンディヘイデン

2
これはコメント内でStrunkとWhiteを強制しますか?
Eric

1
2017年10月25日以降pep8、この回答で言及されているパッケージの名前はgithub.com/PyCQA/pycodestyle/releases/tag/1.7.1pycodestyle
hb20007

8

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

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

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


2
あるlittle = more[3: 5]pep8(ライブラリ)のバグ?yapfは間違いなくここの未来であり、その背後にあるアルゴリズム(基本的にはすべてのフォーマットオプションのグラフで最短経路)は非常にエレガントなソリューションであり、標準的なフォーマットだけでなく、バ​​グも少なくなるでしょう。
アンディヘイデン

@AndyHayden欠けている機能のようですが、E225は修正されません
ChillarAnand

5

eclipse + PyDevを使用している場合は、PyDevの設定からautopep8をアクティブにするだけです。ウィンドウ->設定->検索フィルターに「autopep8」と入力します。

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

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

スクリーンショット


3

私はpythonとコードスタイルのさまざまな楽器について幅広い調査を行いました。インストゥルメントには2つのタイプがあります。リンター-コードを分析し、不正に使用されたコードスタイルについていくつかの警告を出し、修正方法のアドバイスを表示します。コードフォーマッター-ファイルを保存すると、PEPスタイルを使用してドキュメントを再フォーマットします。

再フォーマットはより正確でなければならないため-不要なものを改造すると役に立たなくなる-PEPの一部がカバーされなくなるため、リンターがより多く表示されます。

それらのすべては、構成するための異なるアクセス許可を持っています-たとえば、すべてのルールで構成可能なpylinter(すべての種類の警告をオン/オフにすることができます)、まったく構成できない黒。

ここにいくつかの便利なリンクとチュートリアルがあります:

ドキュメンテーション:

リンター(人気順):

コードフォーマッター(人気順):


1

沢山あります。

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

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

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

自動再フォーマットの特定の方法の1つは、ファイルを(コメントをドロップせずに)ASTツリーに解析し、それをテキストにダンプします(つまり、元のフォーマットは一切保持されません)。その例はhttps://github.com/python/blackです。

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