파이썬`import x`와`from x import y` 문을 정렬하는 올바른 방법은 무엇입니까?


170

파이썬 스타일 가이드는 이 같은 그룹 수입에 제안한다 :

수입품은 다음 순서로 그룹화해야합니다.

  1. 표준 라이브러리 가져 오기
  2. 관련 제 3 자 수입
  3. 로컬 애플리케이션 / 라이브러리 특정 가져 오기

그러나 두 가지 수입 방법을 제시하는 방법에 대해서는 언급하지 않았다.

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는 아마도 그 기능의 개발자가 선호하는 모든 기능을 수행했을 것입니다.

BDFL (또는 다른 Python 핵심 개발자)의 의견이나 전자 메일을 설명하는 다른 PEP를 찾고 있습니다. 자신의 선호도를 나타내는 주관적인 답변을 게시하지 마십시오.


20
이것을 종결하기로 투표 한 사용자에게 : 나는 의견을 요구 하지 않습니다 ! 내 질문의 마지막 단락을 읽으십시오.
ThiefMaster

9
나는 "올바른"방법이 있는지 의심한다. 이것에 대해 나만의 스타일을 고르는 것이 왜 문제입니까? 아무도 모르면 컨벤션이 거의 없습니다. 그리고 정말로 중요합니까? 이것을 지정하면 어떤 이점이 있습니까?
Steven Rumbalski

6
PEP8과 같은 +1 사운드를 확장해야합니다.
hochl

7
PEP가 약하다고해서 반드시 수정이 필요한 것은 아닙니다.
Ignacio Vazquez-Abrams

2
나는 일반적으로 논리적 인 그룹으로 수입 한 후 정렬이 작은 그룹 분할 선 길이 가 있다는 단순한 이유를 ... 좋네요. 이 논리 그룹을 논리적 인 순서로 배치하면 가져 오기를 매우 빠르게 검색 할 수 있습니다 ( Ctrl+F수입을 구성하는 방법에 관계없이 일정한 시간 외에 ...)
Bakuriu

답변:


112

수입품은 일반적으로 알파벳순으로 정렬되며 PEP 8 이외의 다양한 장소에 설명되어 있습니다.

알파벳순으로 정렬 된 모듈은 더 빨리 읽고 검색 할 수 있습니다. 결국 파이썬은 가독성에 관한 것입니다. 또한 무언가를 가져 왔는지 확인하는 것이 더 쉽고 중복 된 가져 오기를 피합니다

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

참고 문헌 :

추신 : isort 유틸리티는 자동으로 가져 오기를 정렬합니다.


21
당신이 실제 질문에 대답하고 어디 ... 표시되지 않습니다
liori

3
@liori 모듈 정렬 방법을 설명하는 참조 / 관련 링크를 제출했습니다. PEP 8은 아무것도 언급하지 않았지만 다른 많은 참고 문헌에서는 이와 같은 import 메소드를 사용하는 것이 좋습니다.
Abhishek

7
문제는 서로에 대한 정렬 import xfrom y import z문장 에 관한 것 입니다. 귀하의 답변에이 질문에 대한 답변이 없습니다. 기본적으로 PEP8 가져 오기 유형별로 그룹화하는 방법을 설명하는 질문의 일부를 쉬고 있습니다. 이 특정 질문에 대한 답변이 일부 링크에있는 경우 관련 부분을 인용하십시오.
liori

2
알파벳순으로 정렬 된 import 문을 읽기가 쉽다는 주장에 대한 의견이 맞지 않습니다. 길이별로 정렬 된 import 문과 비교하여 읽기가 훨씬 어렵습니다. 주어진 길이 그룹 내에서 사 전적으로 정렬하면 괜찮을 것이고 심지어 유익 할 수도 있습니다. 그러나, 나는 찾을 것이다 import datetime다음에 import os 열심히보다 읽기 import os다음에 import datetime. 어휘 정렬과 어휘 정렬이 아닌 경우에 대한 검색의 차이점은 사소한 방식으로도 전혀 중요하지 않습니다.
ely

비공개 대 공개 수입에 어떤 순서를 사용해야합니까? ( import _tkintervs import unittest)
Stevoisiak

30

CIA의 내부 코딩 규칙 ( WikiLeaks Vault 7 leak 의 일부 )에 따르면, 파이썬 수입은 세 그룹으로 그룹화되어야합니다.

  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의 코딩 스타일 가이드 라인이라는 웃음 요소에 대해 찬성했습니다. 매우 영리하지만 동시에 해당 개발자의 전문 지식 수준을 고려할 때 관련성이 있습니다.
Tyler James Harden



1
그러나 from x import y이전 또는 이후에 있어야 하는 경우 예제를 따르지 않습니다 from y import x-모듈의 이름입니까 아니면 주문을 결정하는 실제 수입입니까?
Niklas R.

1
나는 그것이 농담이라는 것을 알고 있지만, 적절한 얼간이로서 이것이 실제로 PEP8에서 온 것임을 지적하고 싶습니다.
Marat

8

PEP 8은 실제로 그것에 대해 아무 말도하지 않습니다. 이 시점에 대한 규칙은 없으며, 파이썬 커뮤니티가 절대적으로 정의해야한다는 의미는 아닙니다. 선택은 프로젝트에는 더 좋지만 다른 것에는 최악 일 수 있습니다 ... 각 솔루션에는 장단점이 있기 때문에 선호도에 대한 질문입니다. 그러나 관례를 따르려면 인용 한 주요 순서를 준수해야합니다.

  1. 표준 라이브러리 가져 오기
  2. 관련 제 3 자 수입
  3. 로컬 애플리케이션 / 라이브러리 특정 가져 오기

예를 들어이 페이지 에서 가져 오기는 각 카테고리 (표준 / 타사 / 귀하)에서 사전 식으로 정렬 하는 것이 좋습니다 . 그러나 페이스 북, 야후 및 그 밖의 다른 곳에서 이것은 또 다른 협약 일 것입니다 ...



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 코드 스타일 가이드

따라서 세 번째 옵션은 정확합니다.

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.