[PEAK] 'Categories' in Python
Phillip J. Eby
pje at telecommunity.com
Fri Dec 10 19:52:17 EST 2004
At 07:15 PM 12/10/04 -0500, Andy Gross wrote:
>On Dec 10, 2004, at 7:07 PM, Phillip J. Eby wrote:
>>
>>I'm having trouble seeing the benefit, versus just using generic
>>functions (either single or multi-dispatch). The only difference between
>>them and what you're doing as far as I can see is that the calling
>>signature would be 'toUpper(someObj)' instead of
>>'someObj.toUpper()'. But apart from that that, there's not any difference.
>
>You could be right - I've barely gotten started playing with
>peak.dispatch, so I might not need this at all. The idea of categories
>may be more accessible to some users, though,
Well, if it's an Objective-C thing, and that's who you're targeting,
sure. On the other hand, if you target Lispy or "functional" people,
they'll be happier with functions. :)
Functions are also pretty basic to Python, anyway; it's certainly no
surprise that a module might provide a 'toUpper()' function, and that it
works if the object it's called on has a 'string' attribute. The only
unusual bit is that you can register different algorithms to accomplish the
operation.
So, generic functions+interfaces = your category concept...
class IStringy(Interface):
string = Attribute("A string")
@dispatch.on('ob')
def toUpper(ob):
"""Return uppercase form of 'ob.string', if it's stringy"""
@toUpper.when(IStringy)
def toUpper(ob):
return ob.string.upper()
class SomeStringy:
protocols.advise(instancesProvide=[IStringy])
So, this is really the same thing, except that the interface defines what
things the categorized object has to have, in order to belong to that
category. Alternatively, you can define two interfaces, and write an
adapter class from one to the other, and then use
'IUpperable(stringy).toUpper()', for example.
Any or all of these approaches could actually be wrapped in an API that
hides the interfacish or generic functiony bits, if you so desired.
More information about the PEAK
mailing list