Python: 직접 만든 클래스의 이름공간 변경하기
반응형
파이썬 패키지를 만들다보면 직접 새로운 변수형이나 객체형을 만드는 경우가 있습니다. 사용자가 type()
을 사용해서 타입체크를 하거나 소스코드의 매개변수의 형태, 출력 결과 형태를 Sphinx가 읽어서 해석하는 경우에의도했던 것과 달리 <class 'autowinpy.type._image.Image'>
처럼 의도와는 다른 결과를 내놓습니다. 이를 해결하는 트릭을 소개합니다.
my_package/
├─ __init__.py
└─ type/
├─ __init__.py
└─ _image.py
my_package/type/__image.py
class Image:
def __init__(self, arg):
pass
my_package/type/__init__.py
from ._image import Image
__all__ = ["Image"]
my_package/__init__.py
from .type import *
불필요하게 이름공간을 차지하는 모듈과 패키지를 제외하고 필요한 Image
클래스만 가져오는 방식을 사용했습니다. 이대로라면 사용자는 my_package.Image
를 이용해서 사용할 수 있습니다. 아마 사용자 문서에도 그렇게 설명하게 될 겁니다.
import my_package
print(type(my_package.Image(1)))
# <class 'autowinpy.type._image.Image'>
그러나 type의 결과는 클래스가 있는 파일시스템을 기준으로 표시합니다. 여기서 타입(type) 내장함수가 어떤 방식으로 클래스의 위치를 표시하는지 살펴봐야 할텐데요. 사실 별거 없습니다. 클래스의 __module__
과 __name__
을 합쳐서 표시하는 겁니다.
my_package/type/__image.py
class Image:
__module__ = 'my_package'
def __init__(self, arg):
pass
이렇게 클래스에서 __module__
을 강제하면,
import my_package
print(type(my_package.Image(1)))
# <class 'autowinpy.Image'>
원하는 결과를 출력할 수 있습니다.
반응형
'프로그래밍 > 파이썬' 카테고리의 다른 글
[Python] 내부 IP 검색, 포트 확인, SSH 호스트네임 확인 (0) | 2022.01.01 |
---|---|
Python 가상환경(venv)에 apt-get으로 설치한 패키지 집어넣기 (0) | 2021.12.31 |
Python 패키지 개발일지 10: 스핑크스 레퍼런스 페이지 만들기 (0) | 2019.12.29 |
Python 패키지 개발일지 09: 패키지를 갈아엎게 하는 문제들 (0) | 2019.12.28 |
Python 패키지 개발일지 08: 스핑크스 & 깃허브 페이지 (중급) (0) | 2019.12.27 |
댓글