Size: a a a

2019 December 10

DI

Danil Ivanov in SPb Python
Maxim Afanasev
Не понял, зачем decimal? Сериализуем в json и кладем в базу.
я к тому что здесь надо просто решить задачу сериализации и десереализации для типов которые нужны, а формат это дело второе

>>> from decimal import Decimal 
>>> Decimal(1)
Decimal('1')
>>> Decimal(1)
Decimal('1')
>>> import json
>>> json.dumps(Decimal(1))
Traceback (most recent call last):
...
   raise TypeError(repr(o) + " is not JSON serializable")
TypeError: Decimal('1') is not JSON serializable
>>>
источник

MA

Maxim Afanasev in SPb Python
Max Block
Мне надо в одном поле в БД хранить объекты произвольного уровня вложенности, пример объекта:

{"a": 1, "b": "bla", "c": Decimal("9.2343"), "d": True, "e": [1, 2, 3, 4], "f": datetime.nownow()}
Ну и ключи этого объекта могут быть также dict-ами.
Ну, смотрите, лучше если у вас будет некий композитный тип данных под это дело. Совсем свободная структура - это не очень хорошо. Тогда вы можете заюзать сериализацию/десериализацию с помощью какой-нибудь либы, типа marshmallow.
источник

MA

Maxim Afanasev in SPb Python
Danil Ivanov
я к тому что здесь надо просто решить задачу сериализации и десереализации для типов которые нужны, а формат это дело второе

>>> from decimal import Decimal 
>>> Decimal(1)
Decimal('1')
>>> Decimal(1)
Decimal('1')
>>> import json
>>> json.dumps(Decimal(1))
Traceback (most recent call last):
...
   raise TypeError(repr(o) + " is not JSON serializable")
TypeError: Decimal('1') is not JSON serializable
>>>
Ну, для этого и нужен marshmallow тот же. В строку перевести, или в integer.
источник

MA

Maxim Afanasev in SPb Python
Вообще, у меня был негативный опыт с Decimal в Python, я его теперь избегаю. )))
источник

SM

Serge Matveenko in SPb Python
Max Block
И надо чтобы этот объет в БД потом можно было бы отредактировать руками через браузер.
так не руками, а через браузер.
делай jsonb поле в постгресе, бери какой-нибудь marshmallow и сериализуй туда и обратно
есть генераторы форм для него
если джанго, можно взять drf и использовать его сериализаторы для этого. и оно тебе даст rest api для редактирования этого
источник

DI

Danil Ivanov in SPb Python
Maxim Afanasev
Вообще, у меня был негативный опыт с Decimal в Python, я его теперь избегаю. )))
правильно, бери два инта )
источник

MA

Maxim Afanasev in SPb Python
Danil Ivanov
правильно, бери два инта )
Можно и один, если для денег.
источник

SM

Serge Matveenko in SPb Python
Danil Ivanov
правильно, бери два инта )
и реализуй всё то же самое, только со своими теплыми и ламповыми багами
источник

SM

Serge Matveenko in SPb Python
Maxim Afanasev
Можно и один, если для денег.
а вот потом ты начнешь конвертировать валюты и ой, казывается некоторый курсы для 10 или 1000 едениц
источник

SM

Serge Matveenko in SPb Python
а когда нужно 10 разделить на 3 ровные части, все равно придется аккуратно это делать. с любым типом данных
источник

MA

Maxim Afanasev in SPb Python
Serge Matveenko
а вот потом ты начнешь конвертировать валюты и ой, казывается некоторый курсы для 10 или 1000 едениц
Shit happens. Деньги, даты, адреса - это все не очень computer-friendly ))) Обязательно что-нибудь пойдет не так.
источник

SM

Serge Matveenko in SPb Python
вообще, чтобы считать деньги, нужны двусторонние и двух этапные транзакции
источник

MA

Maxim Afanasev in SPb Python
А как, кстати, правильно в бухгалтерии делить 100 на 3? Куда копейка девается?
источник

SM

Serge Matveenko in SPb Python
Maxim Afanasev
Shit happens. Деньги, даты, адреса - это все не очень computer-friendly ))) Обязательно что-нибудь пойдет не так.
только если вмешается человек.
адреса - не системные данные
даты - слишком много движений в истории
а вот деньги, простите, но их люди давно научились считать так, чтобы не терять. можно, конечно, прикинуться программистом Рокет банка и забыть про двухэтапные транзакции, а можно изучить вопрос и не терять деньги. Серьезно, так можно и на срок за халатность попасть. Деньги нужно считать правильно или никак.
источник

SM

Serge Matveenko in SPb Python
Maxim Afanasev
А как, кстати, правильно в бухгалтерии делить 100 на 3? Куда копейка девается?
никак. все транзакции только между отправителем и получателем, причем в две стороны. причем с первоначальной блокировкой
источник

SM

Serge Matveenko in SPb Python
ты можешь посчитать, что ⅓ от 10 - это 3.33.
но потом ты берешь эту сумму один раз и переводишь с какого-то счета на какой-то счет. и послед первого перевода у тебя остается 6.67
потом в зависимости от операции. если ты оставляешь треть на первом счете, то останется 3.34. если раздаешь по 3-м счетам, то останется 0.01
вообще, многие системы считают не копейками, а большим количеством знаков. но остатки - нормальная тема
источник

MB

Max Block in SPb Python
Все это надо для приложений, которые будут работать с объектами, которые отображают состояние систем.
Т.е. на клиенском уровне код должнен быть таким, примеры работ с разными типами

1) вначале в settings.py регистрируем объекты, с которыми работает:

DVALUE = {
“int_param”: 1,
“str_param”: “moo”,
“complex_param”: {“a”: 1, “locked_objects”: [1,2,3], “c”: datetime.now()}
}

2) далее в коде django приложения все должно работать максимально удобно:

dvalue.int_param = dvalue.int_param + 5
dvalue.str_ param = “bla bla”
dvalue.complex_param[“locked_objects”] = dvalue.complex_param[“locked_objects”] + [1]

И чтобы все это сохранялось бы в базе, внутри еще будут локи (так как все в многозадачности).

Просто json использовать не получится, так как нужны точные типы как datetime и Decimal еще.

И вроде как PyYAML + свой плагин для Decimal сможет решить это задачу.

3) Если бы работа с этими объектами велась бы только программой, подошел бы и просто pickle. Но еще надо иметь возможность каждый такой объект отредактировать через браузер.
источник

MA

Maxim Afanasev in SPb Python
Вот теперь совсем непонятно стало..
источник

MB

Max Block in SPb Python
Maxim Afanasev
Вот теперь совсем непонятно стало..
В любом случае спасибо, PyYAML + кастомный таг — это решение моей проблемы )
источник

MA

Maxim Afanasev in SPb Python
Сильно в этом сомневаюсь. Мне кажется, вы что-то делаете не так. Если это ваш пет-проект - то ок, а если продакшен - то лучше расскажите подробнее о своей задаче.
источник