[Python-Dev] Call for defense of @decorators (original) (raw)

Bob Ippolito bob at redivi.com
Thu Aug 5 20:59:04 CEST 2004


On Aug 5, 2004, at 2:48 PM, Gustavo Niemeyer wrote:

Hello Ronald,

I'm in favor of @decorators. It's easy to notice them when the are present and they are clearly special. The '[decorator] def ...' and Why are they special? Why should they be more important than any other part of the function definition?

Because they take a function object as input and can do whatever they want with it and return something else.

'decorate(decorator) def ...' are very magic, and are IMHO unfriendly to newbies (you must metion them in any introduction to python, because otherwise users would complety mis the signicance of the decorations). [...] @objc.signature("v@:@i") def saveSheetDidDismissreturnCodecontextInfo(self, sheet, returnCode, contextInfo): pass

The argument to objc.signature is fairly magic and I do try to abstract it away (such as with the introduction of objc.accessor), but that's not always possible. If decorators were not allowed to have arguments I'd have to introduce temporary functions that wouldn't help in readability. Is special syntax in the language really required in this case, considering you're already doing something "fairly magic" anyways?

The alternative would be (current syntax and current PyObjC) this:

def saveSheetDidDismiss_returnCode_contextInfo_(self, sheet, returnCode, contextInfo): pass saveSheetDidDismiss_returnCode_contextInfo_ = objc.selector(saveSheetDidDismiss_returnCode_contextInfo_, signature='v@:@i')

Yes, we pretty much do need special syntax (without using a hack like PJE's). Code like this is pretty commonplace in PyObjC projects.

def saveSheetDidDismissreturnCodecontextInfo(self, sheet,

What is objc.signature() doing?

objc.signature wraps the function object with an objc.selector that specifies specific return and argument types. In this particular case, it declares that the selector saveSheetDidDismiss:returnCode:contextInfo: returns void and takes an object and an integer as arguments. Without this, the selector can not be bridged correctly to the Objective C runtime and the program would crash.

The ctypes package behaves similarly and would use decorators for the same thing. I imagine that other runtime/language bridges would also benefit from similar techniques (Jython, IronPython, Python.NET, JPython.. or whatever else). I can also imagine it being used for things like XML-RPC, SOAP, Apple Events, COM, etc. in a similar manner.

-bob



More information about the Python-Dev mailing list