최근 에 널리 사용되는 Python 스타일 검사기 인 pylint 버전을 업그레이드했습니다 .
전체 패키지 경로를 지정하지 않고 동일한 패키지에서 모듈을 가져 오는 위치를 지적하면서 코드 전체에서 탄도가되었습니다.
새로운 오류 메시지는 W0403입니다.
W0403 : 상대적 가져 오기 % r, % r이어야합니다
패키지 디렉토리와 관련된 가져 오기가 감지 될 때 사용됩니다.
예
예를 들어, 패키지가 다음과 같이 구성되어있는 경우 :
/cake
/__init__.py
/icing.py
/sponge.py
/drink
스폰지 패키지에 다음과 같이 씁니다.
import icing
대신에
import cake.icing
이 오류가 발생합니다.
모든 Pylint 메시지가 똑같이 중요하다는 것을 이해하지는 못하지만 메시지를 무시하는 것을 두려워하지 않지만 왜 그러한 관행이 나쁜 생각으로 여겨지는지 이해하지 못합니다.
나는 누군가가 함정을 설명 할 수 있기를 바 랐기 때문에 (현재 계획대로)이 가짜 경고를 끄는 대신 코딩 스타일을 개선 할 수 있기를 바랐습니다.
답변
문제 import icing
는 절대 수입인지 또는 상대적 수입인지 알 수 없다는 것입니다. icing
파이썬 경로의 모듈 또는 현재 모듈의 패키지 일 수 있습니다. 로컬 패키지가 파이썬 표준 라이브러리 패키지와 이름이 같을 때 이것은 매우 성가신 일입니다.
from __future__ import absolute_import
암시 적 상대 가져 오기를 모두 해제 할 수 있습니다 . 모호성에 대한 이러한 정당화를 포함하여 PEP 328에 기술되어있다 . Python 3000에는 암시 적 상대 가져 오기가 완전히 해제되어 있다고 생각합니다.
여전히 상대적 가져 오기를 수행 할 수 있지만 다음과 같이 명시 적으로 가져와야합니다.
from . import icing
답변
몇 가지 좋은 이유가 있습니다.
-
모듈을 움직일 때 상대적 가져 오기가 쉽게 중단됩니다.
패키지에
foo.bar
, afoo.baz
및baz
모듈 이 있다고 가정 하십시오.foo.bar
importsfoo.baz
이지만 상대적 가져 오기를 사용합니다.이제로 이동
foo.bar
하면bar
갑자기 다른 모듈을 가져오고 있습니다baz
! -
상대적 수입은 모호하다.
bar
위의 예제에서 모듈을 이동하지 않아도 프로젝트에 참여하는 새로운 개발자baz
는 실제로foo.baz
루트 수준baz
패키지 가 아니라는 사실을 깨닫지 못하여 용서받을 수 있습니다 .절대 수입은 사용중인 모듈을 명시 적으로 만듭니다. 그리고
import this
설교 로서 , 암시적인 것보다 명시적인 것이 낫습니다. -
파이썬 3는 암시 적 상대적 가져 오기를 모두 비활성화했습니다. 임포트는 항상 절대로 해석됩니다. 즉, 위의 예에서는
import baz
항상 최상위 모듈을 임포트합니다. 대신 명시 적 가져 오기 구문을 사용해야합니다 (from . import baz
).파이썬 2에서 3으로 예제를 포팅하면 예상치 못한 문제가 발생할 수 있습니다. 절대 수입을 사용하면 코드가 미래를 보장 할 것입니다.