Python의 절대 가져오기에 대한 질문에 답변이 있습니다. Python 2.5 변경 로그 및 함께 제공되는 PEP. 그러나 Python 2.5를 설치하고 from __future__ import absolute_import
를 올바르게 사용하는 예제를 만들려고 하면 상황이 그렇게 명확하지 않다는 것을 깨달았습니다.
위에 링크된 변경 로그에서 바로 이 문은 절대 가져오기 변경 사항에 대한 나의 이해를 정확하게 요약했습니다.
다음과 같은 패키지 디렉토리가 있다고 가정해 보겠습니다.
pkg/pkg/__init__.py pkg/main.py pkg/string.py
이것은
pkg.main
및를 포함하는
하위 모듈.pkg
라는 패키지를 정의합니다. pkg.stringmain.py 모듈의 코드를 고려합니다.
import string
문을 실행하면 어떻게 됩니까? Python 2.4 및 이전 버전에서는 먼저 패키지의 디렉토리에서 상대 가져오기를 수행하고 pkg/string.py를 찾고 해당 파일의 내용을pkg.string
모듈로 가져오고 해당 모듈은 이름에 바인딩됩니다.pkg.main
모듈 이름의"string"
Pace.
그래서 다음과 같은 정확한 디렉토리 구조를 만들었습니다.
$ ls -R .: pkg/ ./pkg: __init__.py main.py string .py
__init__.py
및 string.py
가 비어 있습니다. main.py
에는 다음 코드가 포함되어 있습니다.
import string print string.ascii_uppercase
예상대로 Python 2.5에서 실행 AttributeError
:
$ python2.5 pkg/main.py 역추적(가장 최근 호출 마지막): 파일 "pkg/main.py", 줄 2 , <모듈> print string.ascii_uppercase AttributeError: "module" 개체에는 "ascii_uppercase" 속성이 없습니다.
그러나 2.5 변경 로그에서 더 나아가 다음을 찾습니다(강조 추가됨).
Python 2.5에서는
from __future__ import absolute_import
지시문을 사용하여import
의 동작을 절대 가져오기로 전환할 수 있습니다. 이 절대 가져오기 동작은 다음에서 기본값이 됩니다. 향후 버전(아마도 Python 2.7). 절대 가져오기가 기본값이면가져오기 문자열
은 항상 표준 라이브러리의 버전을 찾습니다.
따라서 main.py
와 동일하지만 향후 추가 가져오기 지시문이 있는 pkg/main2.py
를 만들었습니다. 이제 다음과 같이 보입니다.
from __future__ import absolute_import import string print string.ascii_uppercase
Python 2.5에서 실행하지만... 실패 AttributeError
:
$ python2.5 pkg/main2.py 역추적(가장 최근 호출): 파일 "pkg/main2.py", 라인 3, < ;모듈> print string.ascii_uppercase AttributeError: "module" 개체에는 "ascii_uppercase" 속성이 없습니다.
이는 문자열 가져오기
가 항상된다는 진술과 완전히 모순됩니다. strong> 절대 가져오기가 활성화된 std-lib 버전을 찾습니다. 게다가 절대 가져오기가 "새로운 기본" 동작이 될 예정이라는 경고에도 불구하고 __future__
지시문을 사용하거나 사용하지 않고 Python 2.7을 사용하여 동일한 문제에 부딪쳤습니다.
$ python2.7 pkg/main.py 역추적(가장 최근 호출 마지막): 파일 "pkg/main.py", 줄 2, <module> 인쇄 string.ascii_uppercase AttributeError: "module" 개체 "ascii_uppercase" 속성이 없습니다. $ python2.7 pkg/main2.py 역추적(가장 최근 호출 마지막): 파일 "pkg/main2.py", 줄 3, <module> 인쇄 string.ascii_uppercase AttributeError: "module" 개체 "ascii_uppercase" 속성이 없습니다.
Python 3.5는 포함하거나 포함하지 않습니다(두 파일에서 print
문이 변경되었다고 가정):
$ python3.5 pkg/main.py 역추적(가장 최근 호출 마지막): 파일 "pkg/main.py", 줄 2, <module> print(string.ascii_uppercase) AttributeError: module "string " "ascii_uppercase" 속성이 없습니다. $ python3.5 pkg/main2.py Trac eback(가장 최근 호출 마지막): 파일 "pkg/main2.py", 줄 3, <module> print(string.ascii_uppercase) AttributeError: 모듈 "string"에는 "ascii_uppercase" 속성이 없습니다.
다른 변형을 테스트했습니다. string.py
대신에 빈 모듈(빈 __init__.py
만 포함하는 string
이라는 디렉토리)을 만들었습니다. main.py
에서 수입품을 발행할 때 cd
"를 pkg
로 가지고 있고 REPL에서 직접 수입품을 실행합니다. 이러한 변형(또는 그것들의 조합)은 위의 결과를 변경했습니다. 나는 이것을 __future__
지시문과 절대 가져오기에 대해 읽은 것과 조화시킬 수 없습니다.
이것은 쉽게 설명할 수 있는 것 같습니다. 다음(Python 2 문서에서 가져온 것이지만 이 문은 Python 3)에 대한 동일한 문서에서 변경되지 않은 상태로 유지됩니다.
sys.path
(...)
프로그램 시작 시 초기화된 대로 이 목록의 첫 번째 항목인
path[0]
는 Python 인터프리터를 호출하는 데 사용된 스크립트가 포함된 디렉토리입니다. y는 사용할 수 없습니다(예: 인터프리터가 대화식으로 호출되거나 스크립트가 표준 입력에서 읽는 경우),path[0]
는 빈 문자열로, 파이썬이 현재 디렉토리가 먼저입니다.
그래서 내가 놓친 것이 무엇입니까? __future__
문이 말하는 대로 되지 않는 이유는 무엇이며, 문서의 이 두 섹션과 설명된 동작과 실제 동작 사이의 모순에 대한 해결 방법은 무엇입니까?