Python 十进制自定义上下文
Python decimal custom context
上下文管理器 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
上下文管理器 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