Python模型对象验证

6 投票
3 回答
3525 浏览
提问于 2025-04-17 04:14

我正在写一个接口,这个接口会被两个应用程序使用。这个接口需要用到一些 DoSomethingRequestDoSomethingResponse 类来进行通信。

有没有什么库可以进行模型验证,比如像Django的 Model 那样的?

我基本上想要的是能够说:
对象A必须有一个类型为str()的“text”属性,一个类型为int()的“number”属性,以及一个类型为list()的“items”属性。希望能做到简洁明了。

我在寻找类似下面的东西,或者更好的:

class MyEmbeddedModelClass(EmbeddedModel):
    text = TextField(required = True)

class MyModel(Model):
    text = TextField(required = True)
    number = IntField(default = 0)
    items = ListField(EmbeddedModel)


a = MyModel()
a.text = "aaaa"
a.number = 1
a.items = [
    MyEmbeddedModelClass("bbbb"),
    MyEmbeddedModelClass("cccc"),
    MyEmbeddedModelClass("dddd")
]
a.validate()

我知道我可以自己写,但如果有现成的库我更愿意用,因为我对这个还不太熟悉。

3 个回答

0

因为Python是一种动态语言,所以一般的做法是要求一个对象能够表现得像某个特定类的实例,而不是强制它必须是某种特定类型。

在你的代码中,最好是在你需要使用这些属性的地方,尽早确认这个对象确实拥有这些属性,并且这些属性的值是你所期望的。

如果对象o缺少'someattribute'这个属性,不管它是什么类型,这会引发一个AssertionError异常:

assert(hasattr(o, 'someattribute'))

此外,如果o.someattribute不是一个字符串:

assert(isinstance(o.someattribute, basestring))
2

我觉得可以用装饰器来解决这个问题。
你可以看看这个链接。

结合描述符和类装饰器进行验证

如果想要不同的思路,可以看看鸭子类型

3

如果你想要强制使用接口,或者想要通过设计来确保合同的执行,那么你可能需要使用 zope.interface 这个库。虽然这个名字来源于Zope框架,但实际上它并不依赖于这个框架,外部使用起来也非常方便。

撰写回答