# [Python-Dev] Example for PEP 343

Michael Chermside mcherm at mcherm.com
Tue May 17 23:42:06 CEST 2005

```In PEP 343 Guido writes:
>    8. Another use for this feature is the Decimal context.  It's left
>       as an exercise for the reader.  (Mail it to me if you'd like to
>       see it here.)

Here are two such examples. Pick your favorite for the PEP.

PS: Writing this helped convince me that allowing the use of generators
instead of classes with the "do_template" decorator is quite nice in
practice, even though it gets confusing (for beginners anyhow) if you
start to think about it too much.

-- Michael Chermside

# ===== SAMPLE #1: increasing precision during a sub-calculation =====

import decimal

@do_template
def with_extra_precision(places=2):
"Performs nested computation with extra digits of precision."
decimal.getcontext().prec += 2
yield None
decimal.getcontext().prec -= 2

# == SAMPLE USE of #1 ==
# (Sample taken from the Python Library Reference)

def sin(x):
"Return the sine of x as measured in radians."
do with_extra_precision():
i, lasts, s, fact, num, sign = 1, 0, x, 1, x, 1
while s != lasts:
lasts = s
i += 2
fact *= i * (i-1)
num *= x * x
sign *= -1
s += num / fact * sign
return +s

# ===== SAMPLE #2: insisting on exact calculations only =====

import decimal

@do_template
def assert_exact():
"Raises exception if nested computation is not exact."
ctx = decimal.getcontext()
was_inexact = ctx.traps[decimal.Inexact]
ctx.traps[decimal.Inexact] = True
yield None
ctx.traps[decimal.Inexact] = was_inexact

# == SAMPLE USE of #2 ==

# Lemma 2 ensures us that each fraction will divide evenly
do assert_exact():
total = decimal.Decimal(0)
for n, d in zip(numerators, denominators):
total += n / d

```