我對在 python 中修改類繼承有點陌生,特別是在使用類屬性時。在這種情況下,我使用類屬性來更改 pydanticField()函式中的引數。如果我的類包含它自己的建構式,這不會太難做到,但是,我的類User1是從 pydantic 的BaseModel. 這個想法是我希望能夠在創建實體之前更改類屬性。
請參閱下面的一些示例代碼:
from pydantic import Basemodel, Field
class User1(BaseModel):
_set_ge = None # create class attribute
item: float = Field(..., ge=_set_ge)
# avoid overriding BaseModel's __init__
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
User1._set_ge = 0 # setting the class attribute to a new value
instance = User1(item=-1)
print(instance) # item=-1.0
在使用創建實體時,instance = User1(item=-1)我希望拋出驗證錯誤,但它通過驗證并簡單地回傳item值。
如果我有自己的建構式,更改 不會有什么問題_set_ge,但是當User1從 繼承這個建構式時BaseModel,事情會復雜一些。
最終目標是將此類添加到fastapi端點,如下所示:
from fastapi import Fastapi
from schemas import User1
class NewUser1(User1):
pass
NewUser1._set_ge = 0
@app.post("/")
def endpoint(request: NewUser1):
return User1.item
為了減少代碼重復,我的目標是使用這種方法來輕松更改Field()引數。如果有更好的方法,我也很樂意考慮。
這個問題與這個未回答的問題密切相關。
uj5u.com熱心網友回復:
最后,@validator@hernán-alarcón的提議可能是做到這一點的最佳方式。例如:
from pydantic import Basemodel, Field
from typing import ClassVar
class User(BaseModel):
_set_ge = ClassVar[float] # added the ClassVar typing to make clearer, but the underscore should be sufficient
item: float = Field(...)
@validator('item')
def limits(cls, v):
limit_number = cls._set_ge
if v >= limit_number:
return v
else:
raise NumberNotGeError(limit_value=limit_number)
class User1(User)
_set_ge = 0 # setting the class attribute to a new value
instance = User1(item=-1) # raises the error
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/365900.html
上一篇:無法回圈到輸入驗證代碼中的某個點
