Десятичный пользовательский контекст Python
Контекстный менеджер 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
Почему это происходит и как это решить?
1 ответ
Решение
Это происходит потому, что вы на самом деле не входите в менеджер контекста (вызовите __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