programing

가져오기 문 python3의 변경 사항

testmans 2023. 5. 5. 08:44
반응형

가져오기 문 python3의 변경 사항

pep-0404의 다음 내용을 이해할 수 없습니다.

Python 3에서는 패키지 내의 암묵적 상대 가져오기를 더 이상 사용할 수 없습니다. 절대 가져오기와 명시적 상대 가져오기만 지원됩니다.또한 별 가져오기(예: x 가져오기*)는 모듈 수준 코드에서만 허용됩니다.

상대적으로 중요한 것은 무엇입니까?python2에서 스타 가져오기가 허용된 다른 장소는 어디입니까?예를 들어 설명해 주세요.

상대 가져오기는 현재 스크립트/패키지를 기준으로 패키지를 가져올 때마다 수행됩니다.

다음 트리를 예로 들어 보겠습니다.

mypkg
├── base.py
└── derived.py

자, 당신의derived.py필요한 것이 있습니다.base.py파이썬 2에서, 당신은 이렇게 할 수 있었습니다.derived.py):

from base import BaseThing

파이썬 3은 '상대적'인지 '절대적'인지 명시적이지 않기 때문에 더 이상 지원하지 않습니다.base즉, Python 패키지에 다음과 같은 이름이 있다면base시스템에 설치하면 잘못된 것을 얻을 수 있습니다.

대신 경로 유사성 기준으로 모듈의 위치를 명시적으로 지정하는 명시적 가져오기를 사용해야 합니다.당신의.derived.py다음과 같이 표시됩니다.

from .base import BaseThing

선두의.'import'라고 말합니다.base모듈 디렉토리'에서, 즉,.base에 대한 지도../base.py.

마찬가지로, 있습니다...디렉토리 계층 구조로 올라가는 접두사../(와 함께)..mod에 매핑.../mod.py), 그 다음...그것은 두 단계로 올라갑니다.../../mod.py) 등.

그러나 위에 나열된 상대 경로는 현재 모듈(derived.py)가 현재 작업 디렉터리가 아닌 에 있습니다.


@BrenBarn은 이미 스타 수입 사례에 대해 설명했습니다.완전성을 위해서는 저도 같은 말을 해야 할 것입니다 ;).

예를 들어, 몇 가지를 사용해야 합니다.math기능은 하나의 기능에서만 사용합니다.Python 2에서 당신은 반 게으름뱅이가 될 수 있었습니다.

def sin_degrees(x):
    from math import *
    return sin(degrees(x))

Python 2에서 이미 경고를 트리거합니다.

a.py:1: SyntaxWarning: import * only allowed at module level
  def sin_degrees(x):

현대의 파이썬 2 코드에서는 다음 중 하나를 수행해야 합니다.

def sin_degrees(x):
    from math import sin, degrees
    return sin(degrees(x))

또는:

from math import *

def sin_degrees(x):
    return sin(degrees(x))

상대적인 가져오기는 설명서를 참조하십시오.상대적인 가져오기는 절대적으로 다음에서가 아니라 해당 모듈의 위치에 상대적인 모듈에서 가져올 때입니다.sys.path.

에 대해서는import *파이썬 2는 다음과 같은 함수 내에서 스타 가져오기를 허용했습니다.

>>> def f():
...     from math import *
...     print sqrt

Python 2(최소한 최신 버전)에서는 이에 대한 경고가 발생합니다.Python 3에서는 더 이상 허용되지 않으며 모듈의 최상위 수준에서만 스타 가져오기를 수행할 수 있습니다(함수 또는 클래스 내부가 아님).

Python 2와 Python 3을 모두 지원하려면 아래와 같이 명시적인 상대 가져오기를 사용합니다.이 값은 현재 모듈에 상대적입니다.2.5부터 지원됩니다.

from .sister import foo
from . import brother
from ..aunt import bar
from .. import uncle

마이클 고니의 대답에 또 다른 사례를 추가했습니다.

상대 가져오기는 현재 모듈의 이름을 기반으로 합니다.은 항상 메인모듈이입항름상은다 "니의입다"이기 입니다.__main__Python 응용 프로그램의 기본 모듈로 사용되는 모듈은 항상 절대 가져오기를 사용해야 합니다.

언급URL : https://stackoverflow.com/questions/12172791/changes-in-import-statement-python3

반응형