soma0sd

코딩 & 과학 & 교육

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

원하는 결과를 출력할 수 있습니다.

반응형
태그:

댓글

End of content

No more pages to load