У меня есть Pydantic DTO, который выглядит так:
from pydantic import AfterValidator, model_validator, BaseModel
class Bid(BaseModel):
start_block: Annotated[DateTime, AfterValidator(block_validator)]
end_block: Annotated[DateTime, AfterValidator(block_validator)]
threshold: int
pq_pairs: Annotated[List[PriceQuantityPair], AfterValidator(pq_pair_validator)] = Field(min_length=1)
@model_validator(mode = "after")
def validate_bid(self) -> Self:
"""Validate an offer."""
# Check that the start block is before the end block
if self.start_block >= self.end_block:
raise ValueError("The start block must be before the end block.")
for pq_pair in self.pq_pairs:
if self.threshold > pq_pair.quantity:
raise ValueError("The threshold must be less than or equal to the quantity.")
# Return the object now that we've validated it
return self
Это работает нормально, но Pylint выдает ошибку проверки:
E1133: неитерируемое значение self.pq_pairs используется в итерируемом контексте (неитерируемое).
Я предполагаю, что это как-то связано с использованием Annotated
, но я не уверен, что с этим делать. Любая помощь будет оценена по достоинству.
Это заняло некоторое время, но после некоторых экспериментов я понял это! Определение pq_pairs
следующим образом решает проблему:
class Bid(BaseModel):
pq_pairs: Annotated[List[PriceQuantityPair], AfterValidator(pq_pair_validator), Field(min_length=1)]
Предположим, что присвоение Field
атрибуту сбивает с толку пилинт.