IT한 것/python

파이썬 필요한 모듈/심볼 만 내보내기

lovian 2024. 7. 26. 01:51

일단, 나는 파이썬 초보다.

 

배경

요즘 재미가 들려서 이것 저것 만들어보고 있는데, 패키지를 만들고, 의존성을 거는 작업을 하게 되었다.

llm_client 라는 패키지를 만들었는데, 로딩해서 사용 가능한 멤버를 보니 아래와 같다.

>>> import llm_client
>>> llm_client.
llm_client.ABC()             llm_client.LLMMessage(       llm_client.anthropic_client
llm_client.AnthropicClient(  llm_client.LLMMessageRole(   llm_client.config
llm_client.AnthropicConfig(  llm_client.List(             llm_client.dataclass(
llm_client.AnthropicModel(   llm_client.LiteLLMClient(    llm_client.interfaces
llm_client.BaseModel(        llm_client.OpenAIClient(     llm_client.lite_llm_client
llm_client.Enum(             llm_client.OpenAIConfig(     llm_client.load_dotenv(
llm_client.IntEnum(          llm_client.OpenAIModel(      llm_client.openai_client
llm_client.LLMClient()       llm_client.Optional(         llm_client.os
llm_client.LLMConfig()       llm_client.abstractmethod(

 

파이썬 초보의 입장에서 잘 모르는 모듈을 가지고 자동완성 목록이 이렇게 나오면 당황스러울 것 같다.

ABC, Enum, IntEnum같은건 내부에서 사용하는 거고.

config, openai_client, anthropic_client 같은건 모듈화 시킨 파일이름.

그리고 LLMClient, LLMConfig는 추상화된 클래스이다.

 

이것들은 밖에서 쓸 용도가 아니라, 안보여지는게 당연하지 아니한가.

 

힌트

파이썬은 private, public 개념을 언더스코어(_)를 표시하는 것으로 설정한다.

클래스의 멤버를 숨기고 싶으면 언더스코어 두개를 접두어로 사용한다.

그래서 생성자 함수의 이름이 __init__ 인거였음. (뒤에는 그냥 맞추려고한건가.. 일단 더 알아보는건 멈춤)

 

클래스 숨기기

클래스 이름에 접두어로 언더스코어 하나만 끼워주면된다.

class _LLMConfig

식으로 바꾸면 되서 매우 간편한 편.

파일 숨기기

딱히 문서를 찾아보지는 않았는데, 파일 이름에도 접두어로 언더스코어 하나를 붙이니 됨.

config.py -> _config.py

 

import 한 모듈 숨기기

위에서 다 한줄 알았는데, BaseModel, ABC 등의 모듈은 해당 코드에서 import한 심볼(기호)들이다.

때문에 내가 이름을 바꾸는게.. 안될거라고 생각하고 해결했는데, 생각해보니까 import 후 as 구문을 붙이면 되기는 할지도?

아래는 내 모듈의 __init__.py

from .lite_llm_client import *
from .interfaces import *
from .config import *

멋도 모르고 export 하는 줄 알고 가져다 썻는데, 아스테리스크(*)가 문제로 판단되었다.

모든 기호를 가져오라고 했으니, import 한 기호들도 가져온 것 같다.

 

해결 방법은 간단하다.

from ._lite_llm_client import (
  LiteLLMClient
)
from ._interfaces import (
  LLMMessage,
  LLMMessageRole,
)
from ._config import (
  OpenAIModel,
  OpenAIConfig,
  AnthropicModel,
  AnthropicConfig,
)

 

이렇게 나에게 필요한 것만 목록에 추가해주자.

 

결과

>>> import llm_client
>>> llm_client.
llm_client.AnthropicConfig(  llm_client.LLMMessageRole(   llm_client.OpenAIModel(
llm_client.AnthropicModel(   llm_client.LiteLLMClient(    
llm_client.LLMMessage(       llm_client.OpenAIConfig(

 

결론

  • 일단 모듈의 __init__.py 에 진짜 내보낼 모듈의 기호들만 추가한다
  • 하위 모듈의 이름을 숨기고 싶다면, 하위 모듈의 이름에 맨 앞에 언더스코어를 추가한다
  • 하위 모듈을 공개하는 경우에 모듈에 포함된 클래스나 함수들을 숨기고 싶다면, 클래스나 이름 앞에 언더스코어를 추가한다