[Python-Dev] Proposed resolutions for open PEP 343 issues
Nick Coghlan
ncoghlan at gmail.com
Sun Oct 23 11:35:56 CEST 2005
Guido van Rossum wrote:
> Here's another argument against automatically decorating __context__.
>
> What if I want to have a class with a __context__ method that returns
> a custom context manager that *doesn't* involve applying
> @contextmanager to a generator?
>
> While technically this is possible with your proposal (since such a
> method wouldn't be a generator), it's exceedingly subtle for the human
> reader. I'd much rather see the @contextmanager decorator to emphasize
> the difference.
Being able to easily pull a native context manager out and turn it into an
independent context manager just by changing its name is also a big plus. For
that matter, consider a class that had a "normal" context manager (its context
slot), and an alternative context manager (defined as a separate method). The
fact that one had the contextmanager decorator and the other one didn't would
be rather confusing.
So you've convinced me that auto-decoration is not the right thing to do.
Those that really don't like decorating a slot can always write it as:
def UndecoratedSlot(object):
@contextmanager
def native_context(self):
print "Entering native context"
yield
print "Exiting native context cleanly"
__context__ = native_context
Or:
def UndecoratedSlot(object):
def __context__(self):
return self.native_context()
@contextmanager
def native_context(self):
print "Entering native context"
yield
print "Exiting native context cleanly"
However, I'm still concerned about the fact that the following class has a
context manager that doesn't actually work:
class Broken(object):
def __context__(self):
print "This never gets executed"
yield
print "Neither does this"
So how about if type_new simply raises a TypeError if it finds a
generator-iterator function in the __context__ slot?
Regards,
Nick.
--
Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
---------------------------------------------------------------
http://boredomandlaziness.blogspot.com
More information about the Python-Dev
mailing list