[Python-3000] Adaptation [was:Re: Iterators for dict keys, values, and items == annoying :)] (original) (raw)

Benji York benji at benjiyork.com
Sat Apr 1 19:42:33 CEST 2006


Aahz wrote:

On Fri, Mar 31, 2006, Alex Martelli wrote:

Once in a while, I'm moved to sing this refrain again, but thanks to the ensuing discussion I'm soon reminded that there are many more gratifying activities I could pursue instead -- repeated beating of my forehead against suitable brick walls spring to mind as being both more productive and more fun, for example. That's because you're a masochist. ;-) Seriously, I can almost see why you think adaptation is a huge gain, but every time I start looking closer, I get bogged down in trying to understand adaptation registration. Do you have a simple way of explaining how that works well and simply? Because unless one can handle registration cleanly, I don't understand how adaptation can be generally useful for Python. Conversely, if adaptation registration is NOT required, please explain that in simple terms.

In Zope 3 adapters are normally registered via a one line ZCML directive, but that's more for configuration management than anything else; it makes it easier to swap adapters in and out. You can also use Python to do the same thing:

from zope import component component.provideAdapter(MyAdapter)

MyAdapter can be any callable that takes one or more objects (the things being adapted) and provides a single interface. The class would look like this:

class MyAdapter: component.adapts(ISomething) interface.implements(ISomethignElse)

 def __init__(self, something):
     ...

So in this case the "provideAdapter" queries the adapter to find out what is being adapted to and from. You can also provide those to the provideAdapter call if MyAdapter implements more than one interface or you need to for some other reason.

For adapters that are just functions, decorators can be used to indicate the "to" and "from" interfaces (following the "index" example from earlier):

@component.adapter(IMpz) @interface.implementer(IIndex) def index(mpz): return long(mpz)

The zope.component README goes into more detail (especially the "Adapters" section): http://svn.zope.org/checkout/Zope3/trunk/src/zope/component/README.txt?rev=39671

Benji York



More information about the Python-3000 mailing list