pep-0404 에서 다음을 이해하지 못합니다.
Python 3에서는 패키지 내의 암시 적 상대적 가져 오기를 더 이상 사용할 수 없습니다. 절대 가져 오기 및 명시 적 상대적 가져 오기만 지원됩니다. 또한 스타 가져 오기 (예 : x import *)는 모듈 수준 코드에서만 허용됩니다.
상대 수입이란 무엇입니까? python2에서 스타 임포트가 허용 된 다른 장소는 무엇입니까? 예를 들어 설명하십시오.
답변
상대적 가져 오기는 현재 스크립트 / 패키지를 기준으로 패키지를 가져올 때마다 발생합니다.
예를 들어 다음 트리를 고려하십시오.
mypkg
├── base.py
└── derived.py
이제에는의 정보 derived.py
가 필요합니다 base.py
. Python 2에서는 다음과 같이 할 수 있습니다 ( derived.py
).
from base import BaseThing
Python 3은 더 이상 ‘상대적’또는 ‘절대’를 원하는지 명시 적이 지 않기 때문에 더 이상 지원하지 않습니다 base
. 즉, base
시스템에 Python 패키지라는 이름의 패키지가 설치되어 있으면 잘못된 패키지를 얻게됩니다.
대신 경로와 같은 방식으로 모듈의 위치를 명시 적으로 지정하는 명시 적 가져 오기 를 사용해야 합니다. 당신 derived.py
은 다음과 같이 보일 것입니다 :
from .base import BaseThing
리더 .
는 ‘ base
모듈 디렉토리에서 가져 오기’라고 말합니다 . 즉,에 .base
매핑됩니다 ./base.py
.
마찬가지로 (와 매핑하여 ) ..
디렉토리 계층 구조로 올라간 다음 두 레벨 위로 올라가는 접두사 가 있습니다 (../
..mod
../mod.py
...
../../mod.py
).
그러나 위에 나열된 상대 경로 는 현재 작업 디렉토리가 아닌 현재 모듈 ( derived.py
)이 있는 디렉토리에 상대적인 경로 입니다.
@BrenBarn 은 이미 스타 수입 사례를 설명했습니다. 완전성을 위해, 나는 똑같은 말을해야합니다.).
예를 들어, 몇 가지 math
기능을 사용해야하지만 단일 기능에서만 사용합니다. 파이썬 2에서는 반 게으른 것이 허용되었습니다.
def sin_degrees(x):
from math import *
return sin(degrees(x))
파이썬 2에서는 이미 경고를 트리거합니다.
a.py:1: SyntaxWarning: import * only allowed at module level
def sin_degrees(x):
현대 파이썬 2 코드에서는 파이썬 3에서는 다음 중 하나를 수행해야합니다.
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 *
, Python 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
답변
Michał Górny의 답변에 다른 사례를 추가했습니다.
상대적 가져 오기는 현재 모듈의 이름을 기반으로합니다. 기본 모듈의 이름은 항상 ” __main__
“이므로 Python 응용 프로그램의 기본 모듈로 사용하려는 모듈은 항상 절대 가져 오기를 사용해야합니다.