파이썬에서 상대 수입품에 문제가 있습니까?


89

최근 에 널리 사용되는 Python 스타일 검사기 인 pylint 버전을 업그레이드했습니다 .

전체 패키지 경로를 지정하지 않고 동일한 패키지에서 모듈을 가져 오는 위치를 지적하면서 코드 전체에서 탄도가되었습니다.

새로운 오류 메시지는 W0403입니다.

W0403 : 상대적 가져 오기 % r, % r이어야합니다

패키지 디렉토리와 관련된 가져 오기가 감지 될 때 사용됩니다.


예를 들어, 패키지가 다음과 같이 구성되어있는 경우 :

/cake
  /__init__.py
  /icing.py
  /sponge.py
/drink

스폰지 패키지에 다음과 같이 씁니다.

import icing

대신에

import cake.icing

이 오류가 발생합니다.


모든 Pylint 메시지가 똑같이 중요하다는 것을 이해하지는 못하지만 메시지를 무시하는 것을 두려워하지 않지만 왜 그러한 관행이 나쁜 생각으로 여겨지는지 이해하지 못합니다.

나는 누군가가 함정을 설명 할 수 있기를 바 랐기 때문에 (현재 계획대로)이 가짜 경고를 끄는 대신 코딩 스타일을 개선 할 수 있기를 바랐습니다.

답변:


97

문제 import icing는 절대 수입인지 또는 상대적 수입인지 알 수 없다는 것입니다. icing파이썬 경로의 모듈 또는 현재 모듈의 패키지 일 수 있습니다. 로컬 패키지가 파이썬 표준 라이브러리 패키지와 이름이 같을 때 이것은 매우 성가신 일입니다.

from __future__ import absolute_import암시 적 상대 가져 오기를 모두 해제 할 수 있습니다 . 모호성에 대한 이러한 정당화를 포함하여 PEP 328에 기술되어있다 . Python 3000에는 암시 적 상대 가져 오기가 완전히 해제되어 있다고 생각합니다.

여전히 상대적 가져 오기를 수행 할 수 있지만 다음과 같이 명시 적으로 가져와야합니다.

from . import icing

2
특히 타협 솔루션의 경우 +1, 아마도 내가해야 할 길입니다.
Oddthinking

2
import .icingfrom . import icing
Jack

11
@ 잭 실제로는 당신이 할 수 있다고 생각하지 않습니다. 에서 PEP328의이 부분 : 상대 수입은 항상 사용해야합니다 from <> import; import <>항상 절대적입니다. 물론, 절대 점 가져 오기는 from <> import선행 점을 생략하여 사용할 수 있습니다 . 이유 import .foo후 때문에 금지는 import XXX.YYY.ZZZ다음 XXX.YYY.ZZZ식에 사용할 수 있습니다. 그러나 .moduleY표현에는 사용할 수 없습니다.
A.Wan

48

몇 가지 좋은 이유가 있습니다.

  1. 모듈을 움직일 때 상대적 가져 오기가 쉽게 중단됩니다.

    패키지에 foo.bar, a foo.bazbaz모듈 이 있다고 가정 하십시오. foo.barimports foo.baz이지만 상대적 가져 오기를 사용합니다.

    이제로 이동 foo.bar하면 bar갑자기 다른 모듈을 가져오고 있습니다 baz!

  2. 상대적 수입은 모호하다. bar위의 예제에서 모듈을 이동하지 않아도 프로젝트에 참여하는 새로운 개발자 baz는 실제로 foo.baz루트 수준 baz패키지 가 아니라는 사실을 깨닫지 못하여 용서받을 수 있습니다 .

    절대 수입은 사용중인 모듈을 명시 적으로 만듭니다. 그리고 import this설교 로서 , 암시적인 것보다 명시적인 것이 낫습니다.

  3. 파이썬 3는 암시 적 상대적 가져 오기를 모두 비활성화했습니다. 임포트는 항상 절대로 해석됩니다. 즉, 위의 예에서는 import baz항상 최상위 모듈을 임포트합니다. 대신 명시 적 가져 오기 구문을 사용해야합니다 ( from . import baz).

    파이썬 2에서 3으로 예제를 포팅하면 예상치 못한 문제가 발생할 수 있습니다. 절대 수입을 사용하면 코드가 미래를 보장 할 것입니다.


10
# 2 및 # 3의 경우 +1 그러나 # 1은 전체 디렉토리가 이동 될 때 (예를 들어, 레벨을 아래로 밀 때) 발생하는 것에 대해 오프셋되어야합니다.
Oddthinking
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.