【发布时间】:2019-12-01 17:14:55
【问题描述】:
虽然可能有更好的方式来表达这个问题,但这个想法非常简单。
我有两节课。包裹和包裹请求。 ParcelRequest 在 API 中用于请求具有给定参数的 Parcel 的信息和
实际上,ParcelRequest 需要与 Parcel 相同的所有参数,但需要一个额外的 quantity 值。
from pydantic import BaseModel
class Parcel(BaseModel):
length: float
width: float
height: float
weight: float
class ParcelRequest(BaseModel):
length: float
width: float
height: float
weight: float
quantity: int
有没有办法让 Parcel 和 ParcelRequest 在 Parcel 被修改时保持“同步”?
from pydantic import BaseModel
class Parcel(BaseModel):
length: float
width: float
height: float
weight: float
class ParcelRequest(BaseModel):
# unpack Parcel attributes here
quantity: int
注意:在此特定示例中,我们无法更改传入请求的结构。这意味着,我们不能简单地在 ParcelRequest 中包含一个引用 Parcel 对象的“parcel”属性,因为它会改变请求的结构。
问题是这是否可以做到。但作为奖励,应该这样做吗?我的信念是,虽然 API 会随着 Parcel 的发展而与它保持同步,但开发人员可能会通过更新 Parcel 无意中破坏 API,除非经过仔细处理并且没有经过适当的测试。
【问题讨论】:
-
为什么不在 ParcelRequest 中放一个指向 Parcel 的“指针”?
-
@thebjorn 好问题,我忘了包括这个。对传入请求正文的结构有一定的要求。使用指针而不是列出的属性会破坏该要求。
-
非声明性方法可能是更好的选择。
common = {'length': float, ...},然后是Parcel = type('Parcel', (BaseModel,), common)和ParcelRequest = type('ParselRequest', (BaseModel,), dict(common, quantity=int))。如果BaseModel是某个元类的包装器,您可以直接调用它而不是调用type。
标签: python python-3.x pydantic