Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

decimal.getcontext() is not applied within bpython #918

Open
DorskFR opened this issue Sep 27, 2021 · 7 comments
Open

decimal.getcontext() is not applied within bpython #918

DorskFR opened this issue Sep 27, 2021 · 7 comments
Labels

Comments

@DorskFR
Copy link

DorskFR commented Sep 27, 2021

Steps to reproduce:

bpython version 0.21 on top of Python 3.9.6
>>> import decimal
>>> decimal.getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
>>> decimal.getcontext().rounding = decimal.ROUND_HALF_UP 
>>> decimal.getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
>>> 

expected the rounding to be changed.
also fails using setcontext()

@thomasballinger
Copy link
Member

thomasballinger commented Sep 27, 2021

Yikes, that's too bad. Apparently this is a "coroutine-local" thing? So guessing switching from greenlets to threads might not fix, instead it would take moving to async?

Maybe we should manually persist this between execution contexts? I want to learn more about coroutine-locals.

@thomasballinger
Copy link
Member

This works in Python 3.6 and is broken in 3.7+.

@sebastinas
Copy link
Contributor

Why wouldn't this work if we switch to threads? All the user code that is executed would be in exactly one thread.

@thomasballinger
Copy link
Member

Maybe it will, I meant to say I don't know if it will or not because it's not a thread local, it's something else.

@sebastinas
Copy link
Contributor

I'm not sure I can follow. The context is thread-local.

@thomasballinger
Copy link
Member

thomasballinger commented Sep 27, 2021

I don't really understand what a coroutine local is yet, but I think it's now sometimes (usually?) a coroutine-local instead based on the value of decimal.HAVE_CONTEXTVAR. Edit: reading more, it sounds like coroutine–locals (contexts) work with threads and additionally work with coroutines, so I think this distinction is not important here (unless we do something with coroutines).

@sebastinas sebastinas added the bug label Oct 12, 2021
@nicolaiarocci
Copy link

nicolaiarocci commented Jun 6, 2023

Still needing help with Python 3.11.3. A workaround that might not apply to everyone is resorting to DefaultContext which works as expected:

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')

>>> decimal.DefaultContext.prec = 6
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.142857')

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants