수입 명세서의 변경 사항


177

pep-0404 에서 다음을 이해하지 못합니다.

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

상대 수입이란 무엇입니까? python2에서 스타 임포트가 허용 된 다른 장소는 무엇입니까? 예를 들어 설명하십시오.

답변:


277

상대적 가져 오기는 현재 스크립트 / 패키지를 기준으로 패키지를 가져올 때마다 발생합니다.

예를 들어 다음 트리를 고려하십시오.

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))

14

상대 수입품은 설명서를 참조하십시오 . 상대 가져 오기는 절대에서 대신 모듈에서 해당 모듈의 위치를 ​​기준으로 가져 오는 경우입니다 sys.path.

에 관해서는 import *, Python 2는 함수 내에서 스타 가져 오기를 허용했습니다.

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

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


6
그 결정은 왜 이루어 졌습니까?
Dor

1
내 생각 엔 배후에있는 아이디어는 '명시 성이 암시적인 것보다 낫다'입니다. PEP20에서-파이썬의 선. Dot before module은 상대 / 비 상대 링크를 명시 적으로 만들어 이름 충돌을 해결합니다. '가독성이 중요합니다.' 약간 고통받습니다.
Pafnucy

2
사실, 그것은 "반대", "실용성이 순도를 능가합니다"결정이었습니다. "import *"가 없으면 컴파일러는 항상 코드를 분석하는 것만으로 지역 변수를 직접 찾아 볼 수 있기 때문에 함수 내에서 로컬 변수 액세스를 최적화하는 데 필요했습니다. 실제로 함수는 로컬 스토리지에 대한 dict을 사용하지 않고 변수가 고유 인덱스를 얻는 최적화 된 배열을 사용합니다.
Veky

11

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

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

14
import .brother는 Python 3.5에서 잘못된 구문 오류를 발생시킵니다. 이것이 정상입니까? 나는 그것이있는 디렉토리에 init .py를 가지고있다
Frikster

1
import .brother는 파이썬 2와 3 모두에 대해 유효하지 않은 구문입니다
Rodrigo E. Principe

@ RodrigoE.Principe 그래서 것 같습니다 import ..uncle. 결정된. 오, 내가 생각한 것은 아마도 Ni를 말하는 기사들에 의해 산만 해졌을 것입니다!
Akseli Palén

4

Michał Górny의 답변에 다른 사례를 추가했습니다.

상대적 가져 오기는 현재 모듈의 이름을 기반으로합니다. 기본 모듈의 이름은 항상 " __main__"이므로 Python 응용 프로그램의 기본 모듈로 사용하려는 모듈은 항상 절대 가져 오기를 사용해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.