LangChain의 ChatPromptTemplate의 __init__ 인수에 대한 부분을 보다 * 가 중간에 오길래 무언가 궁금해졌다.
class ChatPromptTemplate(BaseChatPromptTemplate):
def __init__(
self,
messages: Sequence[MessageLikeRepresentation],
*,
template_format: Literal["f-string", "mustache", "jinja2"] = "f-string",
**kwargs: Any,
) -> None:
이 코드 스니펫은 Python에서 클래스의 생성자 메소드인 __init__ 메소드를 정의하는 부분입니다. 이 메소드는 객체가 생성될 때 호출되며, 객체를 초기화하는 역할을 합니다. 각 매개변수의 의미를 살펴보면 다음과 같습니다.
파라미터 설명
1. self:
• 모든 인스턴스 메소드에서 첫 번째 인수로 self가 사용됩니다. 이는 객체 자신을 참조하며, 생성된 인스턴스에 접근할 수 있게 합니다.
• __init__ 메소드 내에서 self를 통해 객체의 속성을 설정할 수 있습니다.
2. messages: Sequence[MessageLikeRepresentation]:
• messages는 생성자에 전달되는 첫 번째 인수이며, Sequence 타입으로, MessageLikeRepresentation 타입의 객체들로 이루어진 순차적 자료형입니다.
• Sequence는 리스트, 튜플과 같은 순차적 데이터 구조를 포함하는 추상화된 타입입니다. 이 타입 힌트는 messages가 리스트나 튜플과 같은 자료형일 것이라는 것을 의미합니다.
• MessageLikeRepresentation은 사용자 정의 클래스이거나, 메시지를 표현하는 타입일 가능성이 있습니다.
3. template_format: Literal["f-string", "mustache", "jinja2"] = "f-string":
• template_format는 키워드 인수로, 세 가지 문자열 값 중 하나를 가질 수 있습니다: "f-string", "mustache", "jinja2".
• Literal은 Python의 typing 모듈에서 제공하는 기능으로, 특정 값의 집합 중 하나를 선택하도록 제한합니다.
• 이 인수는 기본값으로 "f-string"을 가지며, 따라서 사용자가 특별히 지정하지 않으면 "f-string"이 사용됩니다.
• 이 매개변수는 아마도 템플릿을 처리하는 방식을 지정하는 데 사용될 것입니다.
4. **kwargs: Any:
• **kwargs는 임의의 추가적인 키워드 인수들을 받아들이는 데 사용됩니다.
• kwargs는 딕셔너리 형태로 전달되며, 키는 문자열이고 값은 임의의 타입을 가질 수 있습니다(Any).
• **kwargs는 종종 유연성을 제공하여 함수나 메소드가 예상치 못한 추가 인수를 받아들일 수 있게 합니다.
5. -> None:
• 이 부분은 함수의 반환 타입 힌트를 나타내며, None이 반환됨을 의미합니다.
• 생성자 메소드인 __init__은 객체를 초기화할 뿐, 별도의 값을 반환하지 않으므로 항상 None을 반환합니다.
이 메소드의 역할
• 이 __init__ 메소드는 객체가 생성될 때 호출되며, messages, template_format, 그리고 추가적인 키워드 인수(kwargs)를 사용하여 객체의 초기 상태를 설정합니다.
• messages는 메시지들을 담은 시퀀스 타입의 인수이며, template_format은 메시지를 템플릿으로 처리하는 방식(예: "f-string", "mustache", "jinja2")을 지정합니다.
• kwargs는 추가적인 옵션이나 설정을 받아들일 수 있도록 하여 메소드를 유연하게 만듭니다.
class MyTemplate:
def __init__(
self,
messages: Sequence[str],
*,
template_format: Literal["f-string", "mustache", "jinja2"] = "f-string",
**kwargs: Any,
) -> None:
self.messages = messages
self.template_format = template_format
self.options = kwargs
# 사용 예시
template = MyTemplate(
messages=["Hello, {name}!", "Goodbye, {name}!"],
template_format="jinja2",
option1="value1",
option2="value2"
)
print(template.messages) # ['Hello, {name}!', 'Goodbye, {name}!']
print(template.template_format) # 'jinja2'
print(template.options) # {'option1': 'value1', 'option2': 'value2'}
아래 사용법 3가지 중 마지막번의 사용법임을 알 수 있다.
* 인수 사용법
함수 정의에서 파라미터 앞에 붙는 *는 여러 가지 의미를 가질 수 있지만, 일반적으로 **위치 인수(variable-length positional arguments)**를 나타내는 데 사용됩니다. 이 기호는 함수가 호출될 때 임의의 개수의 위치 인수를 받아들이도록 하는 역할을 합니다.
*의 주요 의미
1. 가변 위치 인수 (*args):
• 함수 정의에서 *args와 같은 형태로 사용되며, 이 함수는 호출 시 여러 개의 위치 인수를 하나의 튜플로 받아들일 수 있습니다.
• args는 이름일 뿐이며, 어떤 이름으로도 사용할 수 있습니다.
def example_function(*args):
print(args)
example_function(1, 2, 3) # (1, 2, 3)
example_function('a', 'b', 'c') # ('a', 'b', 'c')
여기서 args는 튜플이며, 함수에 전달된 모든 위치 인수들을 포함합니다.
2. 위치 인수 언패킹:
• 함수 호출 시, 이미 정의된 시퀀스(리스트나 튜플 등)를 개별 위치 인수로 전달할 때 사용됩니다.
def add(a, b, c):
return a + b + c
numbers = (1, 2, 3)
print(add(*numbers)) # 6
여기서 *numbers는 튜플 numbers를 개별 인수 1, 2, 3으로 언패킹하여 함수에 전달합니다.
3. 키워드 전용 인수:
• 함수 정의에서 *는 특정 위치 이후의 모든 인수들이 키워드 인수로만 전달될 수 있음을 나타냅니다. 즉, 이 인수들은 반드시 키워드=값 형태로 지정해야 합니다.
def example_function(a, b, *, c, d):
print(a, b, c, d)
example_function(1, 2, c=3, d=4) # 올바름
# example_function(1, 2, 3, 4) # 오류: c와 d는 키워드 인수로만 사용 가능
여기서 *는 c와 d 인수가 키워드 인수로만 전달되어야 함을 의미합니다.
요약
• *는 함수 정의에서 임의의 개수의 위치 인수를 받아들이거나, 키워드 전용 인수를 지정할 때 사용됩니다.
• 또한 함수 호출 시 시퀀스를 언패킹하여 개별 위치 인수로 전달할 때도 사용됩니다.
• 이 기호는 Python의 함수 정의 및 호출에서 매우 유연하고 강력한 기능을 제공합니다.
'LLM FullStacker > Python' 카테고리의 다른 글
[Python] Pydantic 의 BaseModel 클래스 사용 (0) | 2024.08.14 |
---|---|
[Python] 패키지와 모듈 범위 (0) | 2024.08.11 |
[Python] Union 과 isinstance 사용법 (0) | 2024.08.11 |
[Python] 여러 Dictionary 병합하기 (0) | 2024.08.11 |
[Python] classmethod에서 cls로 감싸 반환하기 (0) | 2024.08.11 |