
On Tue, Oct 10, 2017 at 12:34 PM, Koos Zevenhoven <k7hoven@gmail.com> wrote:
On Tue, Oct 10, 2017 at 3:42 PM, Nick Coghlan <ncoghlan@gmail.com> wrote: [..]
Context managers are merely syntactic sugar for try/finally statements, so you can't wave your hands and say a context manager is the only supported API: you *have* to break the semantics down and explain what the try/finally equivalent looks like.
Is this what you're asking?
assi = cvar.assign(value) assi.__enter__() try: # do stuff involving cvar.value finally: assi.__exit__()
But then you *are* allowing users to use "__enter__()" and "__exit__()" directly. Which means that some users *can* experience an unbound growth of context values stack that will make their code run out of memory. This is not similar to appending something to a list -- people are aware that lists can't grow infinitely. But it's not obvious that you can't call "cvar.assign(value).__enter__()" many times. The problem with memory leaks like this is that you can easily write some code and ship it. And only after a while you start experiencing problems in production that are extremely hard to track. Yury