문제

PEP 8 말 :

  • 가져 오기는 항상 모듈 댓글과 문서화 직후, 모듈 글로벌 및 상수 전에 파일의 상단에 배치됩니다.

때때로, 나는 pep 8을 위반합니다. 일반적으로 단일 함수 내에 만 사용되는 가져 오기가있는 경우 이렇게합니다.

의견이 있습니까?

편집 (기능으로 가져 오는 것이 좋은 생각이 될 수있는 이유) : :

주된 이유 : 코드를 더 명확하게 할 수 있습니다.

  • 함수 코드를 볼 때 "기능/클래스 XXX 란 무엇입니까?" (xxx는 함수 내에서 사용됩니다). 모듈 상단에 모든 가져 오기가 있다면 XXX가 무엇인지 결정하려면 거기에 가야합니다. 이것은 사용할 때 더 많은 문제입니다 from m import xxx. 봄 m.xxx 이 기능에서 아마도 더 많은 것을 알려줍니다. 무엇에 따라 m IS : 잘 알려진 최상위 모듈/패키지입니다 (import m)? 아니면 하위 모듈/패키지입니까 (from a.b.c import m)?
  • 어떤 경우에는 XXX가 사용되는 위치에 가까운 추가 정보 ( "XXX 란 무엇입니까?")가있는 경우 기능을 쉽게 이해할 수 있습니다.
도움이 되었습니까?

해결책

장기적으로 나는 대부분의 가져 오기가 파일 상단에있는 것에 대해 감사 할 것이라고 생각합니다. 그렇게하면 모듈이 가져 오는 데 필요한 모듈이 얼마나 복잡한 지 알 수 있습니다.

기존 파일에 새 코드를 추가하는 경우 일반적으로 필요한 곳에 가져 오면 코드가 유지되면 가져 오기 라인을 파일 상단으로 이동하여 더 영구적으로 만듭니다.

또 다른 요점, 나는 얻는 것을 선호한다 ImportError 코드가 실행되기 전 예외 - 사전 확인으로서 상단에서 가져 오는 또 다른 이유입니다.

나는 사용한다 pyChecker 사용하지 않은 모듈을 확인합니다.

다른 팁

이와 관련하여 PEP 8을 위반하는 두 가지가 있습니다.

  • 원형 가져 오기 : 모듈 A 가져 오기 모듈 B이지만 모듈 B의 무언가가 모듈 A가 필요하지만 (이것은 종종 원형 의존성을 제거하기 위해 모듈을 리팩터링해야한다는 신호입니다)
  • PDB 브레이크 포인트 삽입 : import pdb; pdb.set_trace() 이것은 편리한 b/c입니다. import pdb 모든 모듈의 맨 위에는 디버그를 원할 수 있으며 중단 점을 제거 할 때 가져 오기를 제거하는 것이 쉽습니다.

이 두 경우 외에는 모든 것을 맨 위에 놓는 것이 좋습니다. 종속성을 더 명확하게 만듭니다.

우리가 사용하는 4 가지 수입 사용 사례는 다음과 같습니다.

  1. import (그리고 from x import y 그리고 import x as y) 맨 위에

  2. 수입 선택. 상단에.

    import settings
    if setting.something:
        import this as foo
    else:
        import that as foo
    
  3. 조건부 수입. JSON, XML 라이브러리 등과 함께 사용됩니다. 상단에.

    try:
        import this as foo
    except ImportError:
        import that as foo
    
  4. 동적 수입. 지금까지, 우리는 이것의 한 예만 있습니다.

    import settings
    module_stuff = {}
    module= __import__( settings.some_module, module_stuff )
    x = module_stuff['x']
    

    이 동적 가져 오기는 코드를 가져 오지 않지만 Python으로 작성된 복잡한 데이터 구조를 가져옵니다. 우리가 손으로 절인 한 것을 제외하고는 절인 데이터 조각과 비슷합니다.

    이것은 또한 모듈의 상단에 더 많은 것입니다.


코드를 더 명확하게하기 위해 우리가하는 일은 다음과 같습니다.

  • 모듈을 짧게 유지하십시오.

  • 모듈 상단에 모든 가져 오기가 있으면 이름이 무엇인지 결정하려면 거기에 가야합니다. 모듈이 짧으면 쉽게 수행 할 수 있습니다.

  • 경우에 따라 이름이 사용되는 곳에 추가 정보를 갖는 경우 기능을 쉽게 이해할 수 있습니다. 모듈이 짧으면 쉽게 수행 할 수 있습니다.

명심해야 할 한 가지 : 불필요한 수입은 성능 문제를 일으킬 수 있습니다. 따라서 이것이 자주 호출되는 함수라면 가져 오기를 상단에 올리는 것이 좋습니다. 물론 이것은 ~이다 최적화이므로 기능 내부에서 가져 오는 것이 파일 상단에서 가져 오는 것보다 더 명확하다는 유효한 사례가있는 경우 대부분의 경우 성능을 능가합니다.

IronpyThon을하고 있다면 내부 기능을 가져 오는 것이 낫다는 말을 들었습니다 (Ironpython에서 코드를 컴파일하는 것이 느려질 수 있기 때문에). 따라서 내부 기능을 가져 오는 방법을 얻을 수 있습니다. 그러나 그 외에는 컨벤션과 싸우는 것이 가치가 없다고 주장합니다.

일반적으로 단일 함수 내에 만 사용되는 가져 오기가있는 경우 이렇게합니다.

내가하고 싶은 또 다른 요점은 이것이 잠재적 인 유지 관리 문제 일 수 있다는 것입니다. 이전에 하나의 기능 만 사용한 모듈을 사용하는 함수를 추가하면 어떻게됩니까? 파일 상단에 가져 오는 것을 기억하십니까? 아니면 가져 오기에 대한 모든 기능을 스캔 하시겠습니까?

fwiw, 함수 내부에서 가져 오는 것이 합리적 인 경우가 있습니다. 예를 들어 CX_ORACLE에서 언어를 설정하려면 NLS를 설정해야합니다._Lang 환경 변수 ~ 전에 수입됩니다. 따라서 다음과 같은 코드가 표시 될 수 있습니다.

import os

oracle = None

def InitializeOracle(lang):
    global oracle
    os.environ['NLS_LANG'] = lang
    import cx_Oracle
    oracle = cx_Oracle

나는 자체 테스트를하는 모듈에 대해이 규칙을 어겼습니다. 즉, 그들은 일반적으로 지원에 사용되지만, 스스로 실행하면 기능을 테스트 할 수 있도록 메인을 정의합니다. 이 경우 때때로 수입합니다 getopt 그리고 cmd 이 모듈은 모듈의 정상적인 작동과 관련이 없으며 테스트에만 포함되어 있음을 코드를 읽는 사람에게 명확하기를 원하기 때문에 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주로 주행적으로 주어졌습니다.

질문에서 온다 모듈을 두 번로드합니다 - 왜 모두?

스크립트 상단의 가져 오기는이 기능을 사용하여 기능의 종속성과 다른 가져 오기를 나타냅니다. 연속 가져 오기가 저렴하기 때문에 성능 단점이없는 것처럼 보입니다.

그만큼 import 그리고 아닙니다 from x import *, 당신은 그것들을 맨 위에 놓아야합니다. 그것은 글로벌 네임 스페이스에 단 하나의 이름 만 추가하고 Pep 8을 고수합니다. 또한 나중에 다른 곳으로 필요하면 아무것도 움직일 필요가 없습니다.

큰 문제는 아니지만 거의 차이가 없기 때문에 Pep 8의 말을하는 것이 좋습니다.

sqlalchemy에 사용되는 대체 접근법을 살펴보십시오 : 종속성 주입 :

@util.dependencies("sqlalchemy.orm.query")
def merge_result(query, *args):
    #...
    query.Query(...)

수입 도서관이 데코레이터에서 어떻게 선언되고 통과되는지 확인하십시오. 기능에 대한 논쟁으로!

이 접근법은 코드를 더 깨끗하게 만들고 작동합니다. 4.5 배 더 빠릅니다 보다 import 성명!

기준: https://gist.github.com/kolypto/589e84FBCFB6312532658DF2FABDB796

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top