Метод перезаписи в экземпляре Pydantic

#python #pydantic

#python #pydantic

Вопрос:

Существует множество решений для перезаписи методов в экземплярах. Но для объекта базовой модели pydantic это кажется проблематичным. Это простой пример:

 from pydantic import BaseModel

class Dog(BaseModel):
    def bark(self):
        print("WOOF")

def new_bark():
    print("WoOoOoF!!")
 

Запуск метода:

 >>> boby = Dog()
>>> boby.bark()
WOOF
 

Перезапись метода:

 >>> boby.bark = new_bark
>>> boby.bark()
ValueError: "Dog" object has no field "bark"
 

Ожидаемым результатом будет напечатанный # WoOoOoF!! . Если Dog не наследует pydantics BaseModel , вы получаете ожидаемый результат.

Возможно ли это вообще?

Комментарии:

1. Разве вы не должны определять new_bark с одним параметром?

Ответ №1:

Я думаю, что проблема каким-то образом связана с __setattr__ методом pydantic. Это несколько отличается от обычных объектов. По этой ссылке люди имеют дело с (не такой же, но похожей) проблемой. https://github.com/samuelcolvin/pydantic/issues/655

Я не знаю внутренних деталей pydantic или причины проблемы, но я думаю, что этот код решит вашу проблему:

 >>> object.__setattr__(boby, "bark", new_bark)
>>> boby.bark()
WoOoOoF!!