I have been working on a side project for which I’m using bpython, a “fancy interface to the Python interpreter.” If you use the Python REPL often, you should check it out. It offers unique features like in-line syntax highlighting, readline-like autocomplete, a “rewind” function to pop the last line of code from memory, auto-indentation and more.
Anyway, today I found a bug in bpython, and that’s that Python’s decimal.getcontext()
does not work with it.
bpython version 0.24 on top of Python 3.11.3
>>> import decimal
>>> decimal.getcontext().prec = 6
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.1428571428571428571428571429')
If you run the same lines in the standard Python REPL, what you get instead is:
bpython version 0.24 on top of Python 3.11.3
>>> import decimal
>>> decimal.getcontext().prec = 6
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.142857')
Further experimenting revealed that, as a workaround, setting DefaultContext
works as expected:
bpython version 0.24 on top of Python 3.11.3
>>> decimal.DefaultContext.prec = 6
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.142857')
I suspect this has something to do with threads, as decimal.getcontext
targets the current thread while
DefaultContext
is global. I went to the bpython repository only to find that a ticket was already opened in 2021. I
added my DefaultContext
observation there.