On 30 August 2017 at 10:18, Yury Selivanov <[email protected]> wrote:
> On Tue, Aug 29, 2017 at 7:36 PM, Greg Ewing <[email protected]>
> wrote:
> [..]
>>> For (1) we want the context change to be isolated. For (2) you say
>>> that the context change should propagate to the caller.
>>
>>
>> No, I'm saying that the context change should *always*
>> propagate to the caller, unless you do something explicit
>> within the generator to prevent it.
>>
>> I have some ideas on what that something might be, which
>> I'll post later.
>
> BTW we already have mechanisms to always propagate context to the
> caller -- just use threading.local() or a global variable. PEP 550 is
> for situations when you explicitly don't want to propagate the state.
Writing an "update_parent_context" decorator is also trivial (and will
work for both sync and async generators):
def update_parent_context(gf):
@functools.wraps(gf):
def wrapper(*args, **kwds):
gen = gf(*args, **kwds):
gen.__logical_context__ = None
return gen
return wrapper
The PEP already covers that approach when it talks about the changes
to contextlib.contextmanager to get context changes to propagate
automatically.
With contextvars getting its own module, it would also be
straightforward to simply include that decorator as part of its API,
so folks won't need to write their own.
While I'm not sure how much practical use it will see, I do think it's
important to preserve the *ability* to transparently refactor
generators using yield from - I'm just OK with such a refactoring
becoming "yield from update_parent_context(subgen())" instead of the
current "yield from subgen()" (as I think *not* updating the parent
context is a better default than updating it).
Cheers,
Nick.
--
Nick Coghlan | [email protected] | Brisbane, Australia
_______________________________________________
Python-Dev mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com