インポート注文コーディング標準


84

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

1
pep8このツールは、現在、これをチェックしません-複数の輸入、それだけのチェックを1つのライン(E401)に
DNA

@DNA知ってよかった、ありがとう。そこに何かがあることを願っています。
alecxe 2014年

PyCharmがこれを行うかもしれませんが、私は100%確信していません。しかし、それはお金がかかります。
Claudiu 2014年

5
@ Claudiu-Pycharmにはコミュニティバージョンもあります。
Amit Verma 2014年

3
何かを見つけられない場合は、独自のpylintプラグインを作成して、これを確認することができます。見てみましょうpylint-プラグイン-utilsの、プラグインの例ここに。(これはコメントとしてより適しているかもしれませんが、コメントする評判はありません。)
mobeets 2014年

回答:


70

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


9
これは今、より投票の多い答えになるはずです。エラー番号が表示されなくなった最近のバージョンの場合は、エラークラスwrong-import-orderです。
Soren Bjornstad 2016

54

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


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

OpenStackのハッキングスタイルチェックはというプロジェクトハッキングいくつかのユニークな紹介flake8の拡張機能。ありhacking_import_groupsそれらの中には、(関連コミット)。

例:

  • 要件

  • 例で使用されているファイル

    • 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.py(によって使用されるローカルインポートtest.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
$

これが将来誰かに役立つことを願っています。


1
あなたはあなた自身に賞金を与えるべきです:-)。ところで、私はこれを自分で使い始めるかもしれません
Tim

2
:彼らはそれがあまりにもエラーが発生しやすいと困難であったことを理由に、このチェックを取り出したgithub.com/openstack-dev/hacking/commit/...
jobevers

@jobeversアップデートしてくれてありがとう!まあ、私は問題なくそれを使用しました:)
alecxe 2015

26

見てhttps://pypi.python.org/pypi/isorthttps://github.com/timothycrosley/isort

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

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

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

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


2
実行isort script_name.py --check-onlyすると、ソートされていないインポートがチェックされ、結果が出力されるだけであることに注意してください。これが私が必要としていたものです。オプションありがとうございます。
alecxe 2014

isort -rc --check --diffすべてのファイルを再帰的にチェックし、チェックするだけで、差分を表示します
ptim 2016

7

flake8プラグインが存在します。flake8インポートオーダー

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

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

I101:fromimportの名前の順序が間違っています。

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

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