我正在使用 API,我必須驗證用戶在 post/put 端點中寫入的資料。但是我的模型類有 10 多個屬性,所以我必須用 10 個 if 來驗證它們,所以這讓我的代碼看起來很糟糕。
例子:
class MyClass():
atr1: str
atr2: str
atr3: str
atr4: str
atr5: str
atr6: str
atr7: str
atr8: str
atr9: str
atr10: str
然后我有我的 put 端點:
@api.put("/update/{id}")
def update(id: int, exemple: MyClass):
if exemple not in exemples:
return {"Error": "exemple not found!"}
if exemple.atr1 != None:
exemples[exemple].atr1 = exemple.atr1
if exemple.atr2 != None:
exemples[exemple].atr2 = exemple.atr2
if exemple.atr3 != None:
exemples[exemple].atr3 = exemple.atr3
if exemple.atr4 != None:
exemples[exemple].atr4 = exemple.atr4
if exemple.atr5 != None:
exemples[exemple].atr5 = exemple.atr5
if exemple.atr6 != None:
exemples[exemple].atr6 = exemple.atr6
if exemple.atr7 != None:
exemples[exemple].atr7 = exemple.atr7
if exemple.atr8 != None:
exemples[exemple].atr8 = exemple.atr8
if exemple.atr9 != None:
exemples[exemple].atr9 = exemple.atr9
if exemple.atr10 != None:
exemples[exemple].atr10 = exemple.atr10
return exemples[exemple]
我知道我可以在另一個地方進行此驗證,但我仍然需要執行 10 個 if 來驗證每個欄位。我正在尋找一種方法來獲取每個屬性的名稱,然后在 for 回圈內的 if 陳述句中使用 for 和驗證進行回圈。我尋找方法來做到這一點。我找到了一種使用__dict__, vars(MyClass) 但我無法使其作業的方法。誰能幫助我以簡單的方式做到這一點?
uj5u.com熱心網友回復:
我可以建議兩種方法來做到這一點,并避免這些 if else 阻塞。
第一:你可以使用屬性。為類中的每個屬性添加一個屬性(getter 和 setter)。這樣,每次從任何地方為類的每個屬性分配新值時,您都會得到驗證。(您應該記住的一個重要注意事項是 I/O 任務中的屬性很慢)。
class MyClass:
_atr1: float
@property
def atr1(self) -> float:
"""
This is getter method and just return the
_atr1 attribute.
"""
return self._atr1
@atr1.setter
def atr1(self, value) -> None:
"""
This is setter method for _atr1 and has a
little validation. If validation will not pass
It will raise an ValueError.
"""
if value > 0:
self._atr1 = value
return
raise ValueError("The value is not enough!")
秒:您可以使用描述符。通過這種方式,您可以在類之外添加許多描述符,并將這些描述符分配給您的屬性。描述符相對于屬性的一個重要優勢是您可以在許多類中使用它們并且它們具有更快的速度。
class NumberDescriptor(object):
"""
This class is a descriptor which validate the value
to be greater than 0
"""
def __init__(self, number=None):
self.number = number
def __get__(self, obj, objtype):
return self.number
def __set__(self, obj, number):
if number > 0:
self.number = number
else:
raise ValueError("The value is not enough!")
class MyClass:
atr1 = NumberDescriptor()
atr2 = NumberDescriptor()
atr3 = NumberDescriptor()
c = MyClass()
c.atr1 = 0
ValueError: The value is not enough!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/464267.html
標籤:Python python-3.x api 验证 快速API
