Числа произвольной точности, Google App Engine, Python, NDB

В качестве академического упражнения я пытаюсь добиться системы произвольной точности (назовем ее AP) в движке приложения Google, используя python и хранилище NDB. Я знаю, что есть библиотеки AP, так что мы можем это пропустить.

Мне любопытно, как можно хранить числа из библиотеки AP таким образом, чтобы их можно было запрашивать с помощью операторов больше, меньше и равно. В идеале это можно было бы сделать с помощью пользовательского класса свойств в модели NDB, но, поскольку модель NDB использует Python, а Python изначально не поддерживает номера AP, я не уверен, что это возможно. Если вы, ребята, согласны, то мы можем перейти к разговору о хранилище в целом — SQL, MongoDB, NDB и т. д.

Насколько я понимаю, системы AP часто разделяют номер AP на коэффициенты (в массиве?), показатель степени и знак. Если мы сохранили их, существует ли комбинация фильтров для этих полей, которая могла бы выполнять операции больше, меньше и равно? Можно ли вообще сохранить коэффициент, если он действительно хранится в виде массива?

Заранее спасибо!




Ответы (2)


Вот одно из возможных решений. Во-первых, мне нужно использовать объект Decimal, без AP нужна библиотека, похоже. Чтобы сохранить его, я мог бы преобразовать его в строку, используя один из методов класса. Например, получить из него кортеж и преобразовать к строке. Затем я мог бы сохранить эту строку в свойстве NDB Text и используйте дополнительный ComputedProperty для преобразования этой строки в Decimal.

Однако я не совсем уверен, как это ComputedProperty будет храниться в NDB и действительно ли это будет AP и, следовательно, будет полезно запрашивать. В документы говорят: "Вычисленное значение записывается в хранилище данных, поэтому что его можно запросить...". Но хранится ли он как фактическое десятичное число? Или номер АП?

person Nate    schedule 08.08.2014

Вам необходимо использовать свойство подкласса: https://cloud.google.com/appengine/docs/python/ndb/subclassprop

В вашем случае либо в виде строки (затем верните ее обратно в Decimal в вашем _from_base_type), либо в виде двух целых чисел (целое число, представляющее целое число, и показатель степени деления, чтобы вернуть число (например, 0,123 как 123 и 3 как 123/ 10^3 == 0,123).

ComputedProperty не может хранить типы данных, отличные от обычных.

person Ned Lowe    schedule 25.10.2016