from __future__ import absolute_import는 실제로 무엇을 합니까?

| | | | | | | | |

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.string 하위 모듈.

main.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__.pystring.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__ 문이 말하는 대로 되지 않는 이유는 무엇이며, 문서의 이 두 섹션과 설명된 동작과 실제 동작 사이의 모순에 대한 해결 방법은 무엇입니까?

Shop

Learn programming in R: courses

$

Best Python online courses for 2022

$

Best laptop for Fortnite

$

Best laptop for Excel

$

Best laptop for Solidworks

$

Best laptop for Roblox

$

Best computer for crypto mining

$

Best laptop for Sims 4

$

Latest questions

NUMPYNUMPY

psycopg2: insert multiple rows with one query

12 answers

NUMPYNUMPY

How to convert Nonetype to int or string?

12 answers

NUMPYNUMPY

How to specify multiple return types using type-hints

12 answers

NUMPYNUMPY

Javascript Error: IPython is not defined in JupyterLab

12 answers


Wiki

Python OpenCV | cv2.putText () method

numpy.arctan2 () in Python

Python | os.path.realpath () method

Python OpenCV | cv2.circle () method

Python OpenCV cv2.cvtColor () method

Python - Move item to the end of the list

time.perf_counter () function in Python

Check if one list is a subset of another in Python

Python os.path.join () method