[Python-Dev] PEP 567 v2

Guido van Rossum guido at python.org
Wed Jan 3 18:49:31 EST 2018


That was actually Yury's original design, but I insisted on a Mapping so
you can introspect it. (There needs to be some way to introspect a Context,
for debugging.) Again, more later. :-(

On Wed, Jan 3, 2018 at 4:44 PM, Victor Stinner <victor.stinner at gmail.com>
wrote:

> Ok, I finally got access to a computer and I was able to test the PEP
> 567 implementation: see my code snippet below.
>
> The behaviour is more tricky than what I expected. While running
> context.run(), the context object is out of sync of the "current
> context". It's only synchronized again at run() exit. So
> ContextVar.set() doesn't immediately modifies the "current context"
> object (set by Context.run()).
>
> Ok, and now something completely different! What if Context looses its
> whole mapping API and becomes a "blackbox" object only with a run()
> method and no attribute? It can be documented as an object mapping
> context variables to their values, but don't give access to these
> values directly. It would avoid to have explain the weird run()
> behaviour (context out of sync). It would avoid to have to decide if
> it's a mutable or immutable mapping. It would avoid to have to explain
> the internal O(1) copy using HAMT.
>
> Code testing Context.run():
> ---
> import contextvars
>
> name = contextvars.ContextVar('name', default='name')
>
> def assertNotIn(var, context):
>     try:
>         context[var]
>     except LookupError:
>         pass
>     else:
>         raise AssertionError("name is set is context")
>
>
> def func1():
>     name.set('yury')
>     assert name.get() == 'yury'
>     assertNotIn(name, context)
>
> def func2():
>     assert name.get() == 'yury'
>     assert context[name] == 'yury'
>
> context = contextvars.copy_context()
>
> assert name.get() == 'name'
> assertNotIn(name, context)
>
> context.run(func1)
>
> assert name.get() == 'name'
> assert context[name] == 'yury'
>
> context.run(func2)
>
> assert name.get() == 'name'
> assert context[name] == 'yury'
> ---
>
> Victor
>



-- 
--Guido van Rossum (python.org/~guido)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20180103/67cc7847/attachment.html>


More information about the Python-Dev mailing list