On Tue, Oct 10, 2017 at 12:34 PM, Koos Zevenhoven firstname.lastname@example.org wrote:
On Tue, Oct 10, 2017 at 3:42 PM, Nick Coghlan email@example.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
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.