[Python-Dev] Call for defense of @decorators
Ronald Oussoren
ronaldoussoren at mac.com
Thu Aug 5 21:07:18 CEST 2004
On 5-aug-04, at 20:48, 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?
>
>> '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 saveSheetDidDismiss_returnCode_contextInfo_(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?
>
> What is objc.signature() doing?
The argument is fairly magic, in that most people wouldn't know how the
interpret it. The function itself is easy enough: it creates a custom
method object. The meta-class for Objective-C classes extracts the
method signature from that method object and uses it build the right
method description on the Objective-C side of the bridge.
A special syntax for descriptors is not stricly necessary, we are after
all already using them with Python 2.2 and Python 2.3 code. It does
make life a lot easier, the method names used in my example are not
particularly long, I sometimes uses much longer names (because I have
to [*]). Having 3 copies of such a name increases the likelyhood of
errors, and makes it harder to spot that all 3 names are the same.
To stretch a point: class syntax is also not necessary, instead of a
class definition you can call type() with the right arguments. Does
that mean we should do away with classes?
>
>> The generic example PJE is introducing in PEAK also seem a good
>> usecase
>> for decorators with arguments.
>
> Any pointers?
>
> I'd really like to "see the light" of complex decorators, as oposed
> to KISS, and use the current language features to implement that.
Whoops, I used the wrong word, I meant 'generic functions' instead of
'generic example'. He's doing something like this:
@when("isinstance(db, OracleDB")
def storeInDB(db, object):
pass
@when("isinstance(db, BerkelyDB")
def storeInDB(db, object):
pass
The 'when' decorator converts the function into a generic function that
uses the expressions to dispatch to the right function implementation
at runtime.
Ronald
[*] "have too" because I haven't found a good way to automaticly
convert Objective-C method names in sensible shorter names. Objective-C
has segmented method names, like smalltalk. This looks a little like
keyword arguments:
@interface MyModel : NSObject
{}
-(int)sheetDidEnd:(NSSheet*)sheet returnCode:(int)code
contextInfo:(void*)context;
@end
This looks like a method with 2 keyword arguments, but really isn't.
The method name is 'sheetDid:returnCode:contextInfo:'. I convert that
to a python identifier by replacing colons by underscores. That's an
easy to remember rule, which means I don't have to replicate the vast
amount of Cocoa documentation, but you do end up with some ungainly
method names.
The only way I see to fix this is to introduce segmented method in
Python, but I don't think that would fly :-) :-)
More information about the Python-Dev
mailing list