2016-02-16 2 views
0

Диспетчер контекста decimal.localcontext, по-видимому, игнорируется при использовании в другом контексте. Следующий пример иллюстрирует это (Python 2.7):Python decimal custom context

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 

Почему это происходит, и как ее решить?

ответ

2

Это происходит из-за того, что вы фактически не вводите диспетчер контекста (вызовите метод __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 
+0

Великого, спасибо. Я просто помещаю этот код в функцию 'precision_context'. –