GeezerVison is showing github.com — decimal.getcontext() is not applied within bpython · Issue #918 · bpython/bpython
decimal.getcontext() is not applied within bpython #918DescriptionSteps 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() Reacted by Arseniy Terekhin and Laurynas Alekna Activitythomasballinger commented on 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 commented on Sep 27, 2021 This works in Python 3.6 and is broken in 3.7+. sebastinas commented on Sep 27, 2021 Why wouldn't this work if we switch to threads? All the user code that is executed would be in exactly one thread. thomasballinger commented on Sep 27, 2021 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 commented on Sep 27, 2021 thomasballinger commented on 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). nicolaiarocci commented on 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')Reacted by Arseniy Terekhin and Laurynas Alekna
MetadataMetadataDevelopmentNo branches or pull requestsIssue actions
|