Python 3十进制模块和限制十进制长度

Python 3十进制模块和限制十进制长度,python,python-3.x,decimal,Python,Python 3.x,Decimal,刚从2.7版转到3.4版,我就遇到了这个问题: 我正在尝试使用decimal模块复制SQL数字数据类型。 在2.7中,我做到了: def copy_ctx(places, prec): res = DefaultContext.copy() res.prec = places res.Emin = res.Emax = places - prec - 1 return res 这有效地将任何产生的小数s限制在指定的位数或更少。 尝试实例化过大的数字将产生溢出错误

刚从2.7版转到3.4版,我就遇到了这个问题:

我正在尝试使用
decimal
模块复制SQL数字数据类型。 在2.7中,我做到了:

def copy_ctx(places, prec):
    res = DefaultContext.copy()
    res.prec = places
    res.Emin = res.Emax = places - prec - 1
    return res
这有效地将任何产生的
小数
s限制在指定的位数或更少。
尝试实例化过大的数字将产生溢出错误。
例如:

x = Decimal(1000000, copy_ctx(5,2))  # Error! number is too much
x = Decimal(100, copy_ctx(5,2))  # == 100.00
然而,在Python3.4中,
decimal
不允许我将Emin设置为正数


如何实现与2.7中相同的行为?

好吧,最终,即使是2.7版本的
decimal
模块也不完全是SQL数字友好的。我必须对照我想要的上下文检查每一个结果。现在,我在类构造函数中添加了一个额外的量化步骤。

我会考虑在Python 2.7中允许一个正Emin作为一个bug,真的。使用它设置整数部分的上限是。。创造性。该限制在;唯一的解决方法是禁用
\u decimal
模块(例如,将其从安装中完全删除)。不推荐。我还没有看到其他的选择。你说的“创造性”是什么意思?有没有其他方法可以设置小数位数的最大位数?我的意思是,在库的设计中从来没有考虑过这个用例,
Emin
只应该是0或更小。事实上,这一切都是幸运的。:-)不,我不知道另一种方法。Py3十进制文档现在有这样的内容:“Emin必须在[MIN_Emin,0]范围内,Emax在[0,MAX_Emax]范围内。”