[Python-ideas] PEP draft: context variables

Koos Zevenhoven k7hoven at gmail.com
Tue Oct 10 08:51:52 EDT 2017


On Tue, Oct 10, 2017 at 3:34 PM, Nick Coghlan <ncoghlan at gmail.com> wrote:

> On 10 October 2017 at 01:24, Guido van Rossum <guido at python.org> wrote:
>
>> On Sun, Oct 8, 2017 at 11:46 PM, Nick Coghlan <ncoghlan at gmail.com> wrote:
>>
>>> On 8 October 2017 at 08:40, Koos Zevenhoven <k7hoven at gmail.com> wrote:
>>>
>>>> ​​I do remember Yury mentioning that the first draft of PEP 550
>>>> captured something when the generator function was called. I think I
>>>> started reading the discussions after that had already been removed, so I
>>>> don't know exactly what it was. But I doubt that it was *exactly* the
>>>> above, because PEP 550 uses set and get operations instead of "assignment
>>>> contexts" like PEP 555 (this one) does. ​​
>>>>
>>>
>>> We didn't forget it, we just don't think it's very useful.
>>>
>>
>> I'm not sure I agree on the usefulness. Certainly a lot of the complexity
>> of PEP 550 exists just to cater to Nathaniel's desire to influence what a
>> generator sees via the context of the send()/next() call. I'm still not
>> sure that's worth it. In 550 v1 there's no need for chained lookups.
>>
>
> The compatibility concern is that we want developers of existing libraries
> to be able to transparently switch from using thread local storage to
> context local storage, and the way thread locals interact with generators
> means that decimal (et al) currently use the thread local state at the time
> when next() is called, *not* when the generator is created.
>

​If you want to keep those semantics in decimal, then you're already done.​



> I like Yury's example for this, which is that the following two examples
> are currently semantically equivalent, and we want to preserve that
> equivalence:
>
>     with decimal.localcontext() as ctx:
>         ctc.prex = 30
>         for i in gen():
>            pass
>
>     g = gen()
>     with decimal.localcontext() as ctx:
>         ctc.prex = 30
>         for i in g:
>           pass
>
>
>
​Generator functions aren't usually called `gen`.

Change that to​:

with decimal.localcontext() as ctx:
    ctc.prex = 30
    for val in values():
        do_stuff_with(val)

​# and​

​vals = values()​

​with decimal.localcontext() as ctx:
    ctc.prex = 30
    for val in vals:
        do_stuff_with(val)
​

​I see no reason why these two should be equivalent.


––Koos


-- 
+ Koos Zevenhoven + http://twitter.com/k7hoven +
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20171010/9b99c94a/attachment.html>


More information about the Python-ideas mailing list