Доступ к атрибутам с помощью оператора точки для объектов, созданных с использованием класса модели дуршлаг

Я хочу знать, есть ли способ получить доступ к объектам, созданным с использованием любого класса 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, как только они станут доступны с помощью оператора точки.
Цель этого - помочь клиентам легко получить атрибуты модели, не заглядывая в модель.

1 ответ

Я думаю, вы могли неправильно понять, что здесь делает десериализация. Кроме того, ваш пример кода выглядит неправильно для меня, поскольку десериализация ожидает словарь, похожий на объект, а не строку.

Тем не менее, чтобы ответить на ваш первоначальный вопрос, ответ - нет, вы не можете использовать оператор точки. Причина этого заключается в том, что десериализация ввода фактически возвращает вам словарь, а не объект типа 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
}

Обратите внимание на приведение числовых значений строки к целым числам.

Другие вопросы по тегам