[python] Pydantic - ConfigDict

gunny·2024년 4월 1일
1

Python

목록 보기
12/29

pydantic - ConfigDict

  • Pydantic 라이브러리에서 제공되는 구성 옵션을 딕셔너리 형태로 지정할 수 있는 클래스
    이 클래스를 사용해 모델의 구성 옵션을 설정하고 수정한다.

  • 일반적으로 Pydantic 모델은 클래스 변수로 'Config' 클래스를 사용하여 구성 옵션을 지정한다.
    경우에 따라 프로그램이 실행되는 동안에 동적으로 구성을 변경하거나, 환경 변수에 따라 구성을 조정해야 할 수도 있다. 이 때 pydantic.ConfigDict을 사용해서 구성 옵션을 딕셔너리 형태로 관리한다.

pydantic.ConfigDict 으로 Pydantic 모델의 구성을 동적으로 변경하기

from pydantic import BaseModel, ConfigDict

class MyModel(BaseModel):
	class Config:
    allow_mutation = False # 모델의 인스턴스를 변경할 수 없도록 설정

# 모델의 구성 옵션을 딕셔너리로 설정
MyModel.Config.__dict__.update(ConfigDict(allow_mutation=True))

# allow_mutation 옵션이 변경된 것을 확인
print(MyModel.Config.allow_mutation) # 출력 : True

위에서 'MyModel' 클래스의 구성 옵션인 'allow_mutation'을 딕셔너리 형태로 동적으로 변경하고 있음. 이렇게 하면 프로그램이 실행되는 도안에 구성을 변경하고, 환경에 따라 구성을 조정할 수 있음

allow_mutation

  • Pydantic 모델의 구성 옵션 중 하나로 모델의 인스턴스가 변경 가능한지 여부를 지정한다.
    기본적으로 Pydantic 모델은 불변(immutable) 이다. 한 번 생성된 모델의 인스턴스는 수정할 수 없다는 의미이다. 즉, 한 번 생성된 모델의 필드 값을 변경하거나 새로운 필드를 추가할 수 없다.

    하지만 allow_mutation 옵션을 사용해 이 동작을 변경할 수 있다.
    이 옵션을 True로 설정해, 모델의 인스턴스를 변경할 수 있다.
    즉, 필드 값을 수정하거나 새로운 필드를 추가할 수 있다.

from pydantic import BaseModel

class MyModel(BaseModel):
	name: str
    age: int
    
# 모델의 인스턴스 생성
instance = MyModel(name='Alice', age=30)

#allow_mutation을 True로 생성하여 모델의 인스턴스를 변경 가능하도록 함
MyModel.Config.allow_mutation = True

# 모델의 인스턴스 변경
instance.name = 'Bob'
instance.email = 'bob@example.com'


print(instance.dict())
# 출력 : {'name' : 'Bob', 'age' : 30, 'email' : 'bob@example.com'}

위에서 'MyModel' 클래스의 구성 옵션인 'allow_mutation'을 'True'로 설정해 모델의 인스턴스를 변경 가능하게 했다.
그 결과로 인스턴스 필드 값이 변경되고 새로운 필드를 추가할 수 있게 됐다.

ConfigDict - Protected_namespaces

  • protected namespaces 지정 옵션은 보호된 네임스페이스를 지정하는 옵션이다.

  • Pydantic 모델은 Config 클래스 내에 여러 가지 옵션을 정의할 수 있다. 이 옵션들은 모델의 동작을 제어하고 구성할 수 있는데, 이 중에서도 protected_namespaces는 모델에서 사용할 수 있는 네임스페이스(예: Config, schema, json_encoders 등) 중에서 특정한 네임스페이스를 보호하고자 할 때 사용된다.

  • protected_namspaces 옵션을 사용하면 해당 네임스페이스에서의 속성 변경을 방지할 수 있다.

from pydantic import BaseModel, ConfigDict

class MyModel(BaseModel):
	class Config:
    # Config 네임스페이스를 보호하여 변경을 방지
    protected_namespaces = ('Config',)
    
# protected_namespaces를 설정한 모델 생성
model = MyModel()

# Config 네임스페이스를 변경하려고 하면 예외가 발생

try :
	model.Coifng = 'changed_config'
except AttritubeError as e:
	print(e)
    # 출력 : 'Config' is a proteced namespace

'MyModel' 클래스의 'Config' 네임스페이스를 보호하여 속성의 변경을 방지한다. 이렇게 설정하면 모델의 인스턴스에서 해당 네임스페이스의 속성을 변경할 수 없다. 따라서 속성에 대한 변경 시도가 있으면 AttributeError가 발생한다.

profile
꿈꾸는 것도 개발처럼 깊게

0개의 댓글