web-dev-qa-db-ja.com

インポートオーダーコーディング標準

PEP8 は以下を示唆しています:

インポートは、次の順序でグループ化する必要があります。

  1. 標準ライブラリのインポート
  2. 関連する第三者の輸入
  3. ローカルアプリケーション/ライブラリ固有のインポート

インポートの各グループの間に空白行を挿入する必要があります。

pylintpyflakespycheckerpep8などの静的コード分析ツールを使用して、パッケージのどこかで標準に違反しているかどうかを確認する方法はありますか?


違反の例:

from my_package import my_module
from Django.db import models
import os

インポートする正しい方法:

import os

from Django.db import models

from my_package import my_module
77
alecxe

現在のバージョンのpylintはこれを実行し、エラークラスC0411として報告します。

56
sbywater

更新(2016): sbywater に最新の回答があります。


それを見つけた! (偶然、「Pythonのハッカーのガイド」を読んでいる間)

OpenStack Hacking Style Checksという名前のプロジェクト hacking は、いくつかのユニークな flake8 拡張を導入します。その中に hacking_import_groups があります(関連する commit )。

例:

  • 要件

    • tox
    • flake8
    • ハッキング (マスターブランチから):

      $ git clone https://github.com/openstack-dev/hacking.git
      $ cd hacking/
      $ python setup.py install
      
  • 例で使用されるファイル

    • tox.ini(カスタムチェックを使用することをflake8に伝える必要があります)

      [hacking]
      local-check = hacking.core.hacking_import_groups
      

      UPD:hackingの最新バージョンでは、チェックへのパスが変更され、現在はhacking.checks.imports.hacking_import_groupsです。

    • test.py(チェックの対象)

      import requests
      import sys
      from my_module import print_smth
      
      
      print_smth(requests.get('https://google.com'))
      print_smth(sys.version)
      
    • my_module.pytest.pyで使用されるローカルインポート)

      def print_smth(smth):
          print smth
      

次に、flake8に対してtest.pyを実行すると、

$ flake8 test.py
test.py:2:1: H305  imports not grouped correctly (requests: third-party, sys: stdlib)
test.py:3:1: H305  imports not grouped correctly (sys: stdlib, my_module.print_smth: project)
test.py:3:1: H306  imports not in alphabetical order (sys, my_module.print_smth)

次に、PEP8に続く正しい順序でインポートをグループ化すると、

import sys

import requests

from my_module import print_smth


print_smth(requests.get('https://google.com'))
print_smth(sys.version)

警告は見つかりませんでした:

$ flake8 test.py
$

これが将来誰かを助けることを願っています。

54
alecxe

https://pypi.python.org/pypi/isort または https://github.com/timothycrosley/isort をご覧ください

isortは、指定されたファイルをグローバルレベルのインポート行(try以外のインポート、ブロック、関数などを除く)で解析し、それらをすべてインポートの種類ごとにグループ化されたファイルの先頭に配置します。

  • 未来
  • Python標準ライブラリ
  • 第三者
  • 現在のPythonプロジェクト
  • 明示的にローカル(インポート前、from:import xなど)

カスタム個別セクション(構成ファイルのforced_separateリストで定義)各セクション内で、インポートはアルファベット順にソートされます。 isortは重複したpythonインポートを自動的に削除し、インポートから指定された行の長さまでの長さをラップします(デフォルトは80)。

https://pypi.python.org/pypi/flake8-isort この機能をflake8にプラグインします

25
cleder

flake8プラグインが存在します: flake8-import-order

このパッケージは、3つの新しいflake8警告を追加します

I100:インポートステートメントの順序が間違っています。

I101:fromインポートの名前の順序が間違っています。

I201:セクションまたはインポートの間に改行がありません。

6
phoenix