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 | [EMAIL PROTECTED] | Brisbane, Australia --------------------------------------------------------------- http://boredomandlaziness.blogspot.com _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com