LINUX.ORG.RU

JSON объект сразу в объект python? надо ли?

 , , ,


0

1

Добрый вечер.

По мере погружения в питон, flask и peewee подумалось, что при получении данных от клиента я хочу не парсить в цикле поля и присваивать свойствам объекта ORM, а с помощью json.loads, например, сразу присвоить объекту значения.

Это имеет смысл, или просто выпендрёж?

Т.е. для облегчения кода я могу свою функцию конвертации написать, но я хочу узнать, как хорошо и правильно.

★★★★★

или просто выпендрёж

Это называется удобство ::) //хотя не слушай меня, я не питонист.

Dron ★★★★★
()
Последнее исправление: Dron (всего исправлений: 1)

для простых объектов:

#!/usr/bin/env python3

import json

a = json.loads('{"q":3, "w":6}')

class B(object):
  def __init__(self):
    self.q = 1
    self.e = 2

  def __str__(self):
    a = '%s %s' % (self.q, self.e)
    if 'w' not in self.__dict__:
        return a
    return '%s %s' % (a, self.w)

b = B()
print(b)

b.__dict__.update(a)
print(b)

anonymous
()

я хочу не парсить в цикле поля и присваивать свойствам объекта ORM

А ты подумал, что будет, если тебе загрузят неправильные значения? Json тут панацеей не будет.

Siado ★★★★★
()

Где-то надо, где-то нет. Код покажи лучше.

ei-grad ★★★★★
()
Ответ на: комментарий от anonymous

self.__dict__

b.__dict__

Для любителей ковырять «__dict__» давным-давно есть чудесная стандартная функция «vars».

«vars — и Вас не хочется ушатать тапком за Ваш корявый код!»

Virtuos86 ★★★★★
()

помощью json.loads, например, сразу присвоить объекту значения.

Что-то не соображу с просонья в каком месте тут валидируются данные?

MrClon ★★★★★
()

Вот так хорошо и правильно

x = json.loads(data, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))
E ★★★
()

Сериалайзер хочешь изобрести что ли?

doraneko
()
Ответ на: комментарий от Siado

ну так а чему нельзя эти данные проверять в момент создания объекта?

ggrn ★★★★★
()

msgpack

In [1]: import msgpack

In [2]: obj = {'some': 'data', 'with': 23}

In [4]: obj_packed = msgpack.packb(obj)

In [5]: obj_unpacked = msgpack.loads(obj_packed)

In [6]: obj_unpacked == obj
Out[6]: True
anonymous
()

Валидация - разговор отдельный. Если абстрактный вакуум, то wtforms, заполнять жсоном, потом валидировать и заполнять класс датой формы.

[code lang=«python»] class Example: def __init__(self, **kwargs): for k, v in kwargs.items(): setattr(self, k, v)

data = json.loads('{«a»: 1, «b»: 2}') cls = Example(**data)

anonymous
()

Валидация - разговор отдельный. Если абстрактный вакуум, то wtforms, заполнять жсоном, потом валидировать и заполнять класс датой формы.

тут этот шаг пропускается.

class Example:
  def __init__(self, **kwargs):
   for k, v in kwargs.items(): 
     setattr(self, k, v)

data = json.loads('{"a": 1, "b": 2}')
cls = Example(**data)
Kesha_Molchanov
()
Ответ на: комментарий от tailgunner

По ходу, перенёс парсинг объекта json в модель как метод (там и валидация возможна). IMO хорошее решение.

Shadow ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.