Контексты - это среды для арифметических операций. Они определяют точность, устанавливают правила округления, определяют, какие сигналы рассматриваются как исключения, и ограничивают диапазон для показателей.
Каждый поток имеет свой текущий контекст, доступ к которому можно изменить или изменить с помощью функций decimal.getcontext()
и decimal.setcontext()
:
decimal.getcontext()
,decimal.setcontext()
,decimal.localcontext()
,decimal.BasicContext()
,decimal.ExtendedContext()
,decimal.DefaultContext()
.decimal.getcontext()
:Функция decimal.getcontext()
возвращает текущий контекст для активного потока. текущий контекст можно изменять, присваивая атрибутам класса decimal.Context()
другие значения.
>>> import decimal >>> decimal.getcontext() # Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, # capitals=1, clamp=0, flags=[], traps=[Overflow, DivisionByZero, # InvalidOperation]) # Установка новой точности на месте >>> decimal.getcontext().prec = 7
decimal.setcontext(c)
:Функция decimal.setcontext()
устанавливает текущий контекст для активного потока в c
.
>>> import decimal >>> decimal.getcontext() # Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, # Emax=999999, capitals=1, clamp=0, flags=[Inexact, Rounded], # traps=[InvalidOperation, DivisionByZero, Overflow]) >>> C = decimal.Context(prec=5, rounding=decimal.ROUND_UP) >>> decimal.setcontext(C) >>> decimal.getcontext() # Context(prec=5, rounding=ROUND_UP, Emin=-999999, # Emax=999999, capitals=1, clamp=0, flags=[], # traps=[InvalidOperation, DivisionByZero, Overflow])
Вы также можете использовать оператор with
и функцию decimal.localcontext()
для временного изменения активного контекста.
decimal.localcontext(ctx=None)
:Функция decimal.localcontext()
возвращает диспетчер контекста, который установит текущий контекст для активного потока в копию ctx
при входе в оператор with
и восстанавливает предыдущий контекст при выходе из оператора with
. Если контекст не указан, используется копия текущего контекста.
Например, следующий код устанавливает текущую десятичную точность в 42 места, выполняет вычисления, а затем автоматически восстанавливает предыдущий контекст:
from decimal import localcontext with localcontext() as ctx: # Выполнить расчет высокой точности ctx.prec = 42 s = calculate_something() # Округлить окончательный результат до точности по умолчанию s = +s
decimal.BasicContext
:Класс decimal.BasicContext
это стандартный контекст, определенный "Общей десятичной арифметической спецификацией". Точность установлена до девяти. Округление установлено в decimal.ROUND_HALF_UP
. Все флаги очищены. Все ловушки включены и рассматриваются как исключения, за исключением неточных, округляемых и субнормальных.
Поскольку многие ловушки включены, этот контекст полезен для отладки.
decimal.ExtendedContext
:Класс decimal.ExtendedContext
это стандартный контекст, определенный "Общей десятичной арифметической спецификацией". Точность установлена до девяти. Округление установлено в decimal.ROUND_HALF_EVEN
. Все флаги очищены. Ловушки не включены, чтобы исключения не возникали во время вычислений.
Поскольку прерывания отключены, этот контекст полезен для приложений, которые предпочитают иметь значение результата NaN
или Infinity
и не вызывать исключения. Это позволяет приложению завершить расчеты при наличии условий, которые в противном случае остановили бы программу.
decimal.DefaultContext
:Класс decimal.DefaultContext
этот контекст используется конструктором decimal.Context()
в качестве прототипа для новых контекстов. Изменение поля точность приводит к изменению значения по умолчанию для новых контекстов, созданных конструктором контекста decimal.Context()
.
Этот контекст наиболее полезен в многопоточных средах. Изменение одного из полей до запуска потоков приводит к настройке общесистемных значений по умолчанию. Изменение полей после запуска потоков не рекомендуется.
В однопоточных средах предпочтительно вообще не использовать этот контекст. Вместо него просто явно создайте контексты.
Значения по умолчанию: prec=28
, rounding=ROUND_HALF_EVEN
и разрешенные прерывания для переполнения, InvalidOperation
и DivisionByZero
.