Python 十进制自定义上下文

标签 python decimal contextmanager

上下文管理器decimal.localcontext在另一个上下文中使用时显然会被忽略。以下示例说明了这一点(Python 2.7):

from decimal import Decimal, Context, localcontext
from contextlib import contextmanager

@contextmanager
def precision_context(precision):
    yield localcontext(Context(prec=precision))

PRECISION=4
SMALL_NUMBER=Decimal('0.0001')

with localcontext(Context(prec=PRECISION)):
    # This is working as it should
    print SMALL_NUMBER + 1 # prints 1.000

with precision_context(PRECISION):
    # But this is not
    print SMALL_NUMBER + 1 # prints 1.0001

为什么会出现这种情况,如何解决?

最佳答案

发生这种情况是因为您实际上并未进入上下文管理器(调用 __enter__ 方法)。没有任何东西调用 localcontext(Context(prec= precision)).__enter__ 因为

with precision_context(PRECISION):

仅进入 precision_context 上下文管理器。

您可以通过添加另一个 with 语句来解决该问题:

with precision_context(PRECISION) as ctx:
    # Enter `localcontext(Context(prec=precision))`
    with ctx:
        print(SMALL_NUMBER + 1) # prints 1.000

关于Python 十进制自定义上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35436873/

相关文章:

python - 在同一个 Python 包中加载模块

python - 为什么我的 Bokeh 图在 github 上不起作用?

python - 如何在异步循环关闭之前等待对象的 __del__ 完成?

python - 如何打开一堆文件(使用上下文管理)而不嵌套一堆缩进

python - 如何对 Pandas 中的多列进行求和或计数

python - concurrent.futures 是 GIL 的良药吗?

c++ - 将大十六进制数转换为十进制数

sql-server - SQL Server 'MONEY' 数据类型是十进制浮点还是二进制浮点?

perl - 比较两个十进制值与perl中的特定范围

python - 使用 Sqlalchemy 时 Session_scope 引发属性错误