web-dev-qa-db-ja.com

Python `import x`および` from x import y`ステートメントをソートする正しい方法は何ですか?

pythonスタイルガイド は、インポートを次のようにグループ化することを提案しています。

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

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

ただし、インポートの2つの異なる方法をどのようにレイアウトするかについては何も言及していません。

from foo import bar
import foo

それらをソートするには複数の方法があります(それらすべてのインポートが同じグループに属していると仮定しましょう):

  • 最初にfrom..import、次にimport

    from g import gg
    from x import xx
    import abc
    import def
    import x
    
  • 最初にimport、次にfrom..import

    import abc
    import def
    import x
    from g import gg
    from x import xx
    
  • インポートの種類を無視した、モジュール名によるアルファベット順

    import abc
    import def
    from g import gg
    import x
    from xx import xx
    

PEP8はこれの優先順序について言及しておらず、「クリーンアップインポート」機能の中には、おそらくその機能の開発者が好むものであれば何でもできるIDEがあります。

これを明確にする別のPEP、または BDFL(または別のPythonコア開発者)。 自分の好みを示す主観的な回答を投稿しないでください。

139
ThiefMaster

通常、インポートはアルファベット順にソートされ、PEP 8の横のさまざまな場所で説明されます。

アルファベット順でソートされたモジュールは、読みやすく検索可能です。結局、pythonはすべて読みやすさについてです。また、何かがインポートされたことを確認しやすくなり、インポートの重複を回避できます

並べ替えに関してPEP 8で利用できるものは何もありません。

評判の良いサイトやリポジトリからのいくつかの参照も人気があるということで、アルファベット順が道です。

たとえば次のように:

import httplib
import logging
import random
import StringIO
import time
import unittest
from nova.api import openstack
from nova.auth import users
from nova.endpoint import cloud

OR

import a_standard
import b_standard

import a_third_party
import b_third_party

from a_soc import f
from a_soc import g
from b_soc import d

Redditの公式リポジトリには、一般にPEP-8のインポート順序を使用する必要があると記載されています。しかし、いくつかの追加があります

for each imported group the order of imports should be:
import <package>.<module> style lines in alphabetical order
from <package>.<module> import <symbol> style in alphabetical order

参照:

PS: isort utility はインポートを自動的にソートします。

92
Abhishek

CIAの内部コーディング規則( WikiLeaks Vault 7リーク の一部)によると、pythonインポートは3つのグループにグループ化する必要があります。

  1. 標準ライブラリのインポート
  2. サードパーティのインポート
  3. アプリケーション固有のインポート

インポートは、大文字と小文字を区別せずに、これらのグループ内で辞書順に並べる必要があります。

import foo
from foo import bar
from foo.bar import baz
from foo.bar import Quux
from Foob import ar
21
gar

PEP 8はそれについては何も言っていません。この点に慣習はなく、Pythonコミュニティが絶対に定義する必要があるという意味ではありません。選択はプロジェクトにとっては良いことですが、別のプロジェクトにとっては最悪です...各ソリューションには賛否両論があるため、これは好みの問題です。ただし、規則に従う場合は、引用した主な順序を尊重する必要があります。

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

たとえば、 Googleはこのページで推奨インポートは各カテゴリ(標準/サードパーティ/あなたのもの)で辞書式にソートする必要があります )。しかし、Facebook、Yahoo、その他何でも、それは別のコンベンションかもしれません...

8
Maxime Lorant

すべてのimport xステートメントはxの値でソートされ、すべてのfrom x import yステートメントはxの値でアルファベット順にソートされ、ソートされたfrom x import yステートメントのグループはimport xステートメントのソートされたグループに従う必要があります。

import abc
import def
import x
from g import gg
from x import xx
from z import a
0