0

我想知道是否有一种方法可以使用点运算符访问使用任何 Colander Model 类创建的对象。
例子:

class Image(colander.MappingSchema):
    url = colander.SchemaNode(colander.String())
    width = colander.SchemaNode(colander.Int())
    height = colander.SchemaNode(colander.Int())

所以,使用这个模型,如果我反序列化一个 json 字符串,

image = Image.deserialize("{'url':'xyz', 'width':10, 'height':12}")

我想使用点( . )运算符访问 Image 的模型属性。

喜欢,

image.url
image.width
image.height

一旦使用点运算符访问这些属性,它们就应该可以作为 IDE 代码完成建议使用。
这样做的目的是帮助客户在不查看模型的情况下轻松获取模型属性。

4

1 回答 1

0

我想你可能误解了,反序列化在这里做了什么。此外,您的代码示例在我看来是错误的,因为反序列化需要像对象这样的字典而不是字符串。

但是,要回答您最初的问题,答案是否定的,您不能使用点运算符。这样做的原因是反序列化输入实际上会返回一个字典而不是 type 的对象Image请参阅滤锅关于反序列化的文档

因此,以你的例子并纠正它,你会得到这样的东西:

class Image(colander.MappingSchema):
    url = colander.SchemaNode(colander.String())
    width = colander.SchemaNode(colander.Int())
    height = colander.SchemaNode(colander.Int())

image = Image().deserialize({'url':'xyz', 'width':'10', 'height':'12'})

如果您键入并打印变量,将为您提供以下信息image

>>> type(image)
dict
>>> print(image)
{
    'url': 'xyz',
    'height': 12,
    'width': 10
}

请注意将字符串数值转换为整数。

于 2018-03-11T21:41:54.797 回答