이전 연재 보기
- 1. with 절
- 2. Arena-freeing obmalloc
- 3. incremental codecs
- 4. ctypes
- 5. 조건 표현
- 6. C API 청소
- 7. 표준 라이브러리
파이썬 2.5 미리보기 이제 마지막회입니다. 파이썬 2.4에서 import 뒤에 괄호치기 같은 문법이 약간 들어왔는데, 2.5에서는 PEP-328 상대경로 import가 들어왔습니다.
파이썬의 패키지 구조는 다단계 구조입니다. 그래서, 패키지를 구성할 때 한참 밑에 들어가 있는 모듈이 상위 단계에 있는 모듈을 들여오기 위해서는 항상 전체 경로를 다 써야 했습니다. 예를 들어서, 다음과 같이 패키지 구조가 구성되어있다고 할 때,
1 2 3 4 |
twisted +-- internet +-- iocpreactor --- proactor.py | +-- defer.py | +-- base.py +-- plugin.py |
defer 모듈에서 proactor 모듈을 임포트 하려면 이런 방법이 있습니다.
1 2 |
[1] from twisted.internet.iocpreactor import proactor [2] from iocpreactor import proactor |
그리고, defer 에서 base를 들여오는 방법도 2가지 방법이 있습니다.
1 2 |
[3] from twisted.internet import base [4] import base |
[1]과 [2], [3]과 [4]는 각각 대충 보시다시피 각각 절대경로와 상대경로의 차이입니다. 그동안 권고사항으로 패키지 안에서는 꼭 절대경로로 임포트해 주세용~ 이라고 항상 말을 해 오긴 했지만, 대부분의 파이썬 사용자들이 직접 파이썬 매뉴얼을 읽고 공부하는 것이 아니기 때문에, 필드에서는 상대경로가 더 많이 통용되고 있었습니다. 그런데, 여기서 심각한 문제가 발생하는데, 상대경로 임포트가 시점에 따라서 중복으로 임포트 되어서 오작동을 하거나, 엉뚱한 것이 임포트되기도 하고, base같은 흔한 모듈은 더욱 더 큰 문제가 되곤 했습니다.
그래서, 파이썬 2.6부터는 절대경로 임포트를 강제화해서, 위의 예에서 [2]와 [4]같은 것은 이제 더이상 허용되지 않습니다. 대신, 이제 상대경로라는 것을 명시적으로 지정하는 문법이 새로 들어왔습니다.
1 2 3 4 5 6 7 8 9 10 11 |
# defer에서 base 임포트 from . import base # 같은 디렉토리 # defer에서 proactor 임포트 from .iocpreactor import proactor # 하위 디렉토리 # proactor에서 defer 임포트 from .. import defer # 상위 디렉토리 # plugin에서 defer 임포트 from ..internet import plugin # 상위 디렉토리의 다른 하위 디렉토리 |
음… 저는 그냥 앞으로도 계속 절대경로로 쓰고 싶어지네요 –;;;;;;