[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