수입 명세서의 변경 사항


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.