Десятичный пользовательский контекст 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
Другие вопросы по тегам