__future__import absolute_import에서 실제로 수행하는 작업은 무엇입니까?
Python 2.5 change log를 읽고 PEP를 첨부하여 이해했다고 생각되는 Python의 절대 Import에 대한 질문에 답변했습니다.그러나 Python 2.5를 설치하고 적절한 사용 예제를 만들려고 할 때from __future__ import absolute_import
상황이 그렇게 명확하지 않다는 것을 압니다.
위에 링크된 변경 로그에서 직접, 이 진술은 절대적인 수입 변경에 대한 저의 이해를 정확하게 요약했습니다.
다음과 같은 패키지 디렉터리가 있다고 가정합니다.
pkg/ pkg/__init__.py pkg/main.py pkg/string.py
은 " 이름지패키정다니의합를"라는 합니다.
pkg
을포하는을pkg.main
그리고.pkg.string
서브 모듈.pymodule.main.py 의.명령문을 실행하면 어떻게 됩니까?
import string
2가져오기를 .py 을 찾은 다음 을 Python 2.4로 .pkg.string
그리고 그 은 " 모듈고그그리은모이름에바인있다습어니되딩듈▁is▁name▁module다있습니▁bound"라는 이름으로 묶여 ."string"
에 시대에pkg.main
모듈의 네임스페이스입니다.
그래서 저는 정확한 디렉토리 구조를 만들었습니다.
$ ls -R
.:
pkg/
./pkg:
__init__.py main.py string.py
__init__.py
그리고.string.py
비어 있습니다. main.py
에는 다음 코드가 포함되어 있습니다.
import string
print string.ascii_uppercase
2하면 "Python 2.5"라는 오류가 하여 실행이 합니다.AttributeError
:
$ python2.5 pkg/main.py
Traceback (most recent call last):
File "pkg/main.py", line 2, in <module>
print string.ascii_uppercase
AttributeError: 'module' object has no attribute 'ascii_uppercase'
그러나 2.5 변경 로그에서 다음과 같은 내용을 확인할 수 있습니다(추가 강조).
2에서는 Python 2.5를 할 수 .
import
를 사용하여 인 수입에 의from __future__ import absolute_import
지시의이 절대 가져오기 동작은 향후 버전(아마 Python 2.7)에서 기본값이 될 것입니다.절대 가져오기가 기본값이면 에서는 항상 표준 라이브러리의 버전을 찾습니다.
내가 만든 것을 만들었습니다.pkg/main2.py
와동한과 main.py
그러나 추가적인 향후 수입 지침과 함께.이제 다음과 같이 표시됩니다.
from __future__ import absolute_import
import string
print string.ascii_uppercase
그러나 Python 2.5에서 이를 실행하는 것은...으로 실패함AttributeError
:
$ python2.5 pkg/main2.py
Traceback (most recent call last):
File "pkg/main2.py", line 3, in <module>
print string.ascii_uppercase
AttributeError: 'module' object has no attribute 'ascii_uppercase'
이것은 매우 단호하게 다음과 같은 진술과 모순됩니다.import string
절대 가져오기를 사용하도록 설정한 std-lib 버전을 항상 찾습니다.또한 절대 가져오기가 "새로운 기본" 동작이 될 예정이라는 경고에도 불구하고 Python 2.7을 사용하여 동일한 문제를 해결했습니다.__future__
지시:
$ python2.7 pkg/main.py
Traceback (most recent call last):
File "pkg/main.py", line 2, in <module>
print string.ascii_uppercase
AttributeError: 'module' object has no attribute 'ascii_uppercase'
$ python2.7 pkg/main2.py
Traceback (most recent call last):
File "pkg/main2.py", line 3, in <module>
print string.ascii_uppercase
AttributeError: 'module' object has no attribute 'ascii_uppercase'
3만 아니라 3.5 여부와 )print
두 파일 모두에서 문이 변경됨):
$ python3.5 pkg/main.py
Traceback (most recent call last):
File "pkg/main.py", line 2, in <module>
print(string.ascii_uppercase)
AttributeError: module 'string' has no attribute 'ascii_uppercase'
$ python3.5 pkg/main2.py
Traceback (most recent call last):
File "pkg/main2.py", line 3, in <module>
print(string.ascii_uppercase)
AttributeError: module 'string' has no attribute 'ascii_uppercase'
저는 이것의 다른 변형을 테스트했습니다.에 에.string.py
모듈을 . 이 " 빈모을만다니습"입니다. 이름이 지정된 디렉토리입니다.string
빈것포는하만 __init__.py
그리고 수입품을 발행하는 대신.main.py
,있습니다cd
pkg
그리고 REPL에서 직접 가져오기를 실행합니다.이러한 변동(또는 이들의 조합)은 위의 결과를 변경하지 않았습니다.나는 이것을 내가 읽은 것과 조화시킬 수 없습니다.__future__
지시 및 절대 수입.
제가 보기에 이것은 다음과 같이 쉽게 설명할 수 있습니다(이것은 Python 2 문서에서 나온 것이지만 이 문장은 Python 3의 동일한 문서에서 변경되지 않았습니다).
sys.path
(...)
프로그램 시작과 동시에 초기화된 것처럼, 이 목록의 첫 번째 항목은
path[0]
는 Python 인터프리터를 호출하는 데 사용된 스크립트가 들어 있는 디렉터리입니다.할 수 ), " " " " " " " " " " " " 예 " 인 " 프 " 터 " 리 " 력 " 에 " 서 " 경 " 우 " 입 " 읽 " 스 " 스 ",path[0]
빈 문자열입니다. 이 문자열은 Python이 현재 디렉터리의 모듈을 먼저 검색하도록 지시합니다.
그럼 내가 뭘 놓쳤을까요?는 왜?__future__
진술은 겉보기에 그것이 말하는 것을 하지 않습니다, 그리고 설명된 행동과 실제 행동 사이의 이 두 가지 문서 섹션 사이의 이 모순의 해결책은 무엇입니까?
변경 로그의 단어가 잘못되어 있습니다. from __future__ import absolute_import
어떤 것이 표준 라이브러리의 일부인지에 대해 신경쓰지 않습니다.import string
절대 가져오기 기능이 있는 표준 모듈을 항상 제공하지는 않습니다.
from __future__ import absolute_import
만약 당신이import string
Python을 찾습니다.string
듈모가 신대current_package.string
이 어떤 을 주지 string
할듈. 할 때 때▁you.
python pkg/script.py
pkg/script.py
파이썬으로 가는 패키지의 일부처럼 보이지 않습니다.절차에 , 정적인절따라에차상,,pkg
디렉토리가 경로에 추가됩니다..py
에 있는 pkg
디렉토리는 최상위 모듈처럼 보입니다. import string
찾pkg/string.py
상적으로중때아문니이라요면왜, 하냐하대기.pkg/string.py
인 것 같습니다.string
표준 은 여기도이아니는라사실은관서표준가▁the사은실br▁that-▁fact여ary는▁isn▁this.string
모듈이 나타나지 않습니다.
의 일부로 파일을 실행하려면 다음과 같이 하십시오.pkg
패키지, 당신은 할 수 있습니다.
python -m pkg.script
에, 우경이는,pkg
디렉터리가 경로에 추가되지 않습니다.그러나 현재 디렉터리가 경로에 추가됩니다.
다음에 보일러 플레이트를 추가할 수도 있습니다.pkg/script.py
파이썬이 그것을 일부로 취급하도록 만드는 것.pkg
파일로 실행되는 경우에도 패키지:
if __name__ == '__main__' and __package__ is None:
__package__ = 'pkg'
그러나 이는 영향을 미치지 않습니다.sys.path
다음을 제거하려면 추가적인 처리가 필요합니다.pkg
"" " " " "일 경우에는 " " " 입니다.pkg
의 상위 디렉터리가 경로에 없습니다. 경로에도 연결해야 합니다.
절대 가져오기와 상대 가져오기 간의 차이는 패키지에서 모듈을 가져오고 해당 모듈이 해당 패키지에서 다른 하위 모듈을 가져올 때만 적용됩니다.차이점 확인:
$ mkdir pkg
$ touch pkg/__init__.py
$ touch pkg/string.py
$ echo 'import string;print(string.ascii_uppercase)' > pkg/main1.py
$ python2
Python 2.7.9 (default, Dec 13 2014, 18:02:08) [GCC] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pkg.main1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pkg/main1.py", line 1, in <module>
import string;print(string.ascii_uppercase)
AttributeError: 'module' object has no attribute 'ascii_uppercase'
>>>
$ echo 'from __future__ import absolute_import;import string;print(string.ascii_uppercase)' > pkg/main2.py
$ python2
Python 2.7.9 (default, Dec 13 2014, 18:02:08) [GCC] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pkg.main2
ABCDEFGHIJKLMNOPQRSTUVWXYZ
>>>
특히:
$ python2 pkg/main2.py
Traceback (most recent call last):
File "pkg/main2.py", line 1, in <module>
from __future__ import absolute_import;import string;print(string.ascii_uppercase)
AttributeError: 'module' object has no attribute 'ascii_uppercase'
$ python2
Python 2.7.9 (default, Dec 13 2014, 18:02:08) [GCC] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pkg.main2
ABCDEFGHIJKLMNOPQRSTUVWXYZ
>>>
$ python2 -m pkg.main2
ABCDEFGHIJKLMNOPQRSTUVWXYZ
:python2 pkg/main2.py
를 실행할 이 다릅니다.python2
그런 그런다가기오를 합니다.pkg.main2
는 (으)ㄹ 수 있는 것과 .-m
스위치)를 누릅니다.
패지의실행항면상을 합니다.-m
입니다.sys.path
하위 모듈의 의미를 나열하고 올바르게 처리합니다.
또한 패키지 하위 모듈은 더 많은 의미론을 제공하고 오류 발생 시 더 나은 오류 메시지를 제공하기 때문에 명시적인 상대 가져오기를 훨씬 선호합니다.
언급URL : https://stackoverflow.com/questions/33743880/what-does-from-future-import-absolute-import-actually-do
'programing' 카테고리의 다른 글
Vue 2.6.0으로 업그레이드할 때 "SyntaxError: invalid range in character class"가 표시되는 이유는 무엇입니까? (0) | 2023.06.15 |
---|---|
TypeScript에서 "이니셜라이저는 이 바인딩 요소에 값을 제공하지 않으며 바인딩 요소에 기본값이 없습니다"를 수정하는 방법은 무엇입니까? (0) | 2023.06.15 |
TypeScript에서 router.navigate로 새 탭을 여는 방법 (0) | 2023.06.15 |
iOS - UITextField 외부에서 터치할 때 키보드 해제 (0) | 2023.06.15 |
전송 보안이 일반 텍스트 HTTP를 차단했습니다. (0) | 2023.06.15 |