Pythonの「import x」および「from x import y」ステートメントを並べ替える正しい方法は何ですか?


170

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コア開発者)からの関連するコメント/メールを探しています自分の好みを述べた主観的な答えを投稿しないでください。


20
これを閉じることに投票したユーザーに:私は意見を求めていません!私の質問の最後の段落を読んでください。
ThiefMaster 2013

9
「正しい」方法があるとは思えません。これで自分のスタイルを選ぶことの何が問題になっていますか?だれもそれを知らなければ、慣例はほとんどありません。そしてそれは本当に重要ですか?これを指定する利点は何ですか?
Steven Rumbalski、2013

6
PEP8のような+1サウンドは拡張する必要があります。
hochl 2013

7
PEPの弱点は、必ずしも修正が必要であることを意味しません。
Ignacio Vazquez-Abrams

2
私は通常で論理グループと、その後の並べ替えこれらの小グループに輸入を分ける線の長さ、彼らはという単純な理由のために... 見てよりよいです。これらの論理グループを何らかの論理的な順序で配置すると、インポートを非常に高速に検索できます(インポートをCtrl+Fどのように整理しても、一定の時間である...)
Bakuriu

回答:


112

インポートは通常アルファベット順にソートされ、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

または

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ユーティリティは自動的にインポートをソートします。


21
実際の質問にどこで答えているのかわかりません…
liori

3
@lioriモジュールの並べ替え方法を示す参照/関連リンクを送信しました。PEP 8は何も言及しないので、他の多くのリファレンスはこのようなインポート方法を使用することを提案しています。
Abhishek

7
問題は、並べ替えimport xfrom y import z相互に関連するステートメントについてです。私はあなたの答えにこの質問への答えを見ません。基本的には、インポートの種類ごとにグループ化するPEP8の方法を既に説明している質問の一部を繰り返します。この特定の質問に対する回答がリンクの一部にある場合は、関連する部分を引用してください。
liori 2013

2
アルファベット順にソートされたインポートステートメントの方が読みやすいという主張に対する反対意見を述べたいと思います。長さでソートされたインポート文と比較すると、それらを読むのははるかに難しいと思います。与えられた長さのグループ内で字句的にソートした場合、それは問題なく、さらには有益である可能性があります。しかし、私は見つけることimport datetimeが続くimport os ずっとよりも読むのが大変import os続きますimport datetime。そして、字句ソートが与えられている場合と与えられていない場合の検索の違いは非常に些細なため、少しでも問題にはなりません。
2013

プライベートインポートとパブリックインポートにはどの順序を使用する必要がありますか?(import _tkintervs import unittest
Stevoisiak 2018年

30

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

23
CIAのコーディングスタイルガイドラインであるという笑い要素に賛成。非常に賢いですが、同時に、それらの開発者から得られる専門知識のレベルを考えると、関連性があります。
タイラージェームズハーデン2017年



1
しかし、それはfrom x import y前または後でなければならないかどうかの例からは従いませんfrom y import x-それはモジュールの名前ですか、それとも順序を決定する実際のインポートですか?
Niklas R.

1
私はそれが冗談であることを知っていますが、適切なオタクとして、これは実際にはPEP8から来ていることを指摘したいと思います
Marat

8

PEP 8は実際にそれについて何も述べていません。この点に慣例はありません。それは、Pythonコミュニティが絶対に定義する必要があるという意味ではありません。選択はプロジェクトにとってはより良いかもしれませんが、別のものにとっては最悪です...それぞれのソリューションには長所と短所があるため、これは好みの問題です。ただし、慣例に従う場合は、引用した主要な順序を尊重する必要があります。

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

たとえば、このページではインポートを辞書式に、各カテゴリ(標準/サードパーティ/ ユーザー)ソートすることをGoogleが推奨しています。しかし、FacebookやYahooなどでは、それはおそらく別の慣例です...



0

すべての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

受け入れられた答えは少し冗長すぎるように感じます。これがTLDRです。

各グループ内で、各モジュールの完全なパッケージパスに従って、大文字と小文字を区別せずに、インポートを辞書順にソートする必要があります。

Googleコードスタイルガイド

したがって、3番目のオプションは正しいです。

import abc
import def
from g import yy  # changed gg->yy for illustrative purposes
import x
from xx import xx
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.