我使用Pydantic的BaseModel
来创建我的工人阶级。除了带有验证器的方法之外,我还有一些自定义方法。我需要使用自定义函数从functools的singledispatchmethod
装饰器。例如,
class Foo(pydantic.BaseModel):
name: str
bar: int
baz: int
@functools.singledispatchmethod
def handle(self, command: Command) -> CommandResult:
pass
@celery.task
def add(a: int, b: int):
time.sleep(10)
print("Sum is: ", a+b)
但是,使用singledispatchmethod会抛出以下错误
File "/models.py", line 56, in <module>
class Foo(pydantic.BaseModel):
File "pydantic/main.py", line 323, in pydantic.main.ModelMetaclass.__new__
File "pydantic/fields.py", line 411, in pydantic.fields.ModelField.infer
File "pydantic/fields.py", line 342, in pydantic.fields.ModelField.__init__
File "pydantic/fields.py", line 456, in pydantic.fields.ModelField.prepare
File "pydantic/fields.py", line 670, in pydantic.fields.ModelField.populate_validators
File "pydantic/validators.py", line 715, in find_validators
RuntimeError: no validator found for <class 'functools.singledispatchmethod'>, see `arbitrary_types_allowed` in Config
以同样的方式,我还想在一个这样的自定义方法上使用芹菜的任务装饰器。
不是每个装饰器都会导致这种行为。在这种情况下,singledispatchmethod
是一个描述符类,默认不被pydantic
处理。
但是您可以使用keep_untouched
模型配置设置。节选自文档:
keep_untouched
用于模型默认值的类型元组(例如,描述符),在模型创建期间不应该更改,并且不会包含在模型模式中。注意:这意味着模型上具有此类型默认值的属性将被保留,而不是此类型的注释。
class Foo(BaseModel):
name: str
bar: int
@functools.singledispatchmethod
def handle(self, command: str) -> str:
pass
class Config:
keep_untouched = (functools.singledispatchmethod,)