programing

__future__import absolute_import에서 실제로 수행하는 작업은 무엇입니까?

closeapi 2023. 6. 15. 21:53
반응형

__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 stringpkg/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

반응형