Python 모듈의 절대적 vs. 명시 적 상대적 가져 오기
Python 응용 프로그램에서 패키지를 가져 오는 선호하는 방법이 궁금합니다. 다음과 같은 패키지 구조가 있습니다.
project.app1.models
project.app1.views
project.app2.models
project.app1.views
수입 project.app1.models
및 project.app2.models
. 떠오르는 두 가지 방법이 있습니다.
절대 수입 :
import A.A
import A.B.B
또는 PEP 328을 사용하는 Python 2.5에 도입 된 명시 적 상대 가져 오기 :
# explicit relative
import ..A
import .B
이를 수행하는 가장 비단뱀적인 방법은 무엇입니까?
절대 수입. PEP 8 :
패키지 내 수입에 대한 상대적 수입은 매우 권장되지 않습니다. 모든 가져 오기에 항상 절대 패키지 경로를 사용하십시오. PEP 328 [7]이 Python 2.5에서 완전히 구현 되었음에도 불구하고 명시 적 상대 가져 오기 스타일은 적극적으로 권장되지 않습니다. 절대 가져 오기는 더 이식 가능하고 일반적으로 더 읽기 쉽습니다.
명시 적 상대 가져 오기는 좋은 언어 기능이지만 (내 생각에) 절대 가져 오기만큼 명시 적이지는 않습니다. 더 읽기 쉬운 형식은 다음과 같습니다.
import A.A
import A.B.B
특히 여러 다른 네임 스페이스를 가져 오는 경우. 패키지 내에서 가져 오기를 포함하는 잘 작성된 프로젝트 / 튜토리얼을 보면 일반적으로이 스타일을 따릅니다.
좀 더 명확하게하기 위해 몇 번의 추가 키 입력은 다른 사람들 (그리고 아마도 당신)이 당신의 네임 스페이스를 알아 내려고 할 때 (특히 당신이 3.x로 마이그레이션하는 경우) 많은 시간을 절약 할 것입니다. 이름이 변경되었습니다).
Python 상대 가져 오기는 더 이상 권장되지 않지만이 경우 absolute_import를 사용하는 것이 좋습니다.
Guido 자신을 인용 한이 토론을 참조하십시오 .
"이것은 대부분 역사적이지 않습니까? 새로운 상대 가져 오기 구문이 구현되기 전까지는 상대 가져 오기에 여러 가지 문제가있었습니다. 단기 솔루션은 사용하지 않는 것이 좋습니다. 장기적인 솔루션은 명확한 구문을 구현하는 것이 었습니다. 이제 이제는 반 권장을 철회 할 때입니다. 물론, 배 밖으로 나가지 않고-여전히 습득 한 취향을 발견하지만 그 자리가 있습니다. "
OP 는 다음 과 같은 PEP 328 을 올바르게 연결합니다 .
몇 가지 사용 사례가 제시되었으며, 그중 가장 중요한 것은 하위 패키지를 편집하지 않고도 큰 패키지의 구조를 재정렬 할 수 있다는 것입니다. 또한 패키지 내부의 모듈은 상대적 가져 오기 없이는 쉽게 가져올 수 없습니다.
또한 거의 중복되는 질문을 참조하십시오. 언제 또는 왜 파이썬에서 상대 가져 오기를 사용합니까?
물론 그것은 여전히 맛의 문제입니다. 상대적인 가져 오기로 코드를 이동하는 것이 더 쉽지만 예기치 않게 문제가 발생할 수도 있습니다. 수입품의 이름을 바꾸는 것은 그리 어렵지 않습니다.
PEP 328에서 새로운 동작을 강제하려면 다음을 사용하십시오.
from __future__ import absolute_import
이 경우 암시 적 상대 가져 오기가 더 이상 가능하지 않습니다 (예 : import localfile
더 이상 작동하지 않고 from . import localfile
). 깨끗하고 미래의 증명 동작을 위해 absolute_import를 사용하는 것이 좋습니다.
중요한주의 사항은 PEP 338 및 PEP 366 때문에 상대 가져 오기에는 python 파일을 모듈로 가져와야한다는 것 ValueError: Attempted relative import in non-package
입니다. 상대 가져 오기가있는 file.py를 실행할 수 없거나 .
이 제한은 최선의 접근 방식을 평가할 때 고려되어야합니다. Guido는 어떤 경우에도 모듈에서 스크립트를 실행하는 것에 반대합니다.
나는 이것과 __main__ 기계의 다른 제안 된 트위들 링에 대해 -1입니다. 유일한 사용 사례는 모듈의 디렉토리 안에있는 스크립트를 실행하는 것 같습니다. 저는 항상 안티 패턴으로 보았습니다. 제 마음을 바꾸려면 그렇지 않다는 것을 저를 설득해야합니다.
문제에 대한 철저한 토론은 SO에서 찾을 수 있습니다. 레. Python 3는 매우 포괄적입니다.
상대 가져 오기를 사용하면 수십 개의 내부 가져 오기를 변경하지 않고 나중에 패키지 이름을 자유롭게 변경할 수있을뿐만 아니라 순환 가져 오기 또는 네임 스페이스 패키지와 관련된 특정 문제를 해결하는 데 성공했습니다. top "을 눌러 최상위 네임 스페이스에서 다시 다음 모듈 검색을 시작합니다.
참고 URL : https://stackoverflow.com/questions/4209641/absolute-vs-explicit-relative-import-of-python-module
'developer tip' 카테고리의 다른 글
버전 번호 구문 분석을위한 정규식 (0) | 2020.10.23 |
---|---|
Scala 2.8 컬렉션 디자인 튜토리얼 (0) | 2020.10.23 |
C ++에서 빈 클래스의 크기가 0이 아닌 이유는 무엇입니까? (0) | 2020.10.23 |
--start-group 및 --end-group 명령 줄 옵션은 무엇입니까? (0) | 2020.10.22 |
주어진 중심점, 반지름 및 각도로 원에서 점 찾기 (0) | 2020.10.22 |