일단, 나는 파이썬 초보다.
배경
요즘 재미가 들려서 이것 저것 만들어보고 있는데, 패키지를 만들고, 의존성을 거는 작업을 하게 되었다.
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 에 진짜 내보낼 모듈의 기호들만 추가한다
- 하위 모듈의 이름을 숨기고 싶다면, 하위 모듈의 이름에 맨 앞에 언더스코어를 추가한다
- 하위 모듈을 공개하는 경우에 모듈에 포함된 클래스나 함수들을 숨기고 싶다면, 클래스나 이름 앞에 언더스코어를 추가한다