Thread: [Pyobjc-dev] Plea for function/method syntax sugar (PEP 318, with a different syntax)
Brought to you by:
ronaldoussoren
From: Bob I. <bo...@re...> - 2004-02-19 02:28:35
|
Some time ago, mwh developed a patch that adds some syntactical sugar to def, which is equivalent to PEP 318 though it has a different and more flexible syntax... previous threads can be easily found here: http://www.google.com/search?q=+site:mail.python.org+%22meth-syntax- sugar%22 the latest version of mwh's patch is here: http://starship.python.net/crew/mwh/hacks/meth-syntax-sugar-3.diff Here's a quick overview: def foo(args) [sugary, expressions, list]: pass This is equivalent to: def foo(args): pass foo = list(expressions(sugary(foo))) This evaluation order is Guido approved, though at least one person wanted it to be the other way around One would use this in scenarios such as: class FooClass(object): def className(klass) [classmethod]: return klass.__name__ or, even more importantly (to me anyway): # we would change PyObjC to make this a built-in feature.. but, for completeness: import objc def signature(sig): def _signature(fn): return objc.selector(fn, signature=sig) return _signature class FooClass(NSObject): def returnsAnInteger(self) [signature('i@:')]: return 1 def returnsVoidTakesAnInteger_(self, anInteger) [signature('v@:i')]: pass With current syntax, PyObjC is extremely cumbersome: class FooClass(NSObject): def returnsAnInteger(self): return 1 returnsAnInteger = objc.selector(returnsAnInteger, signature='i@:') def returnsVoidTakesAnInteger_(self, anInteger): pass returnsVoidTakesAnInteger_ = objc.selector(returnsVoidTakesAnInteger_, signature='v@:i') # these are actually short examples, compare to something like: # textView_completions_forPartialWordRange_indexOfSelectedItem_ Why we need this: Without it, it's hard use PyObjC correctly. ObjC selector nomenclature is extremely verbose, and your fingers hurt after a while having to type each function name three times. The function __name__ is important, because the objc.selector type has to convert it to a selector:that:uses:colons:, or else the colon:using:name: would have to be specified manually. It makes classmethod/staticmethod/etc more palatable. What the patch doesn't do: lambda is not allowed in the "sugary expressions list" there's no *expansion and it won't take an actual list so if you want a prebaked list of transformations then you'll have to roll a callable that does it such as: def prebake(*expressions): def _prebake(fn): for transformation in expressions: fn = transformation(fn) return fn return fn This syntactical sugar for def is so unbelievably important to PyObjC (and likely other projects) that I am willing to distribute my own modified version of Python if it doesn't make 2.4 (though I would probably use Stackless as the base, but that's another plea for another day). The patch looks like it still applies to CVS HEAD, but there is a little fuzz on hunk 2. I have not tested it yet, but I have tested it against CVS HEAD of the 2.3.3 based Stackless. I'm willing to help however I can in order to get this into Python 2.4. -bob |
From: Thomas H. <th...@py...> - 2004-02-19 18:42:10
|
Bob Ippolito <bo...@re...> writes: > Here's a quick overview: > > def foo(args) [sugary, expressions, list]: > pass > > This is equivalent to: > > def foo(args): > pass > foo = list(expressions(sugary(foo))) > > This evaluation order is Guido approved, though at least one person > wanted it to be the other way around > > One would use this in scenarios such as: > > class FooClass(object): > def className(klass) [classmethod]: > return klass.__name__ > > or, even more importantly (to me anyway): > > # we would change PyObjC to make this a built-in feature.. but, for > # completeness: > import objc > def signature(sig): > def _signature(fn): > return objc.selector(fn, signature=sig) > return _signature > > class FooClass(NSObject): > def returnsAnInteger(self) [signature('i@:')]: > return 1 > def returnsVoidTakesAnInteger_(self, anInteger) [signature('v@:i')]: > pass I was thinking of a similar usecase for ctypes, defining C callback functions. In ctypes, you would be able to write """ WndProc = WINFUNCTYPE(c_int, HWND, MSG, WPARAM, LPARAM) def my_wndproc(hwnd, msg, wParam, lParam) [WndProc]: .... """ instead of this """ WndProc = WINFUNCTYPE(c_int, HWND, MSG, WPARAM, LPARAM) def my_wndproc(hwnd, msg, wParam, lParam): .... my_wndproc = WndProc(my_wndproc) """ BTW (I have this patch not yet applied), is it possible to use more than one line, in this way? def function(arg1, arg2, arg3, arg4, arg5, arg6) [dothis, dothat, doanother]: All in all, I'm +1 on the patch. Thomas |
From: Bob I. <bo...@re...> - 2004-02-19 18:49:00
|
On Feb 19, 2004, at 1:36 PM, Thomas Heller wrote: > Bob Ippolito <bo...@re...> writes: > >> Here's a quick overview: >> >> def foo(args) [sugary, expressions, list]: >> pass >> >> This is equivalent to: >> >> def foo(args): >> pass >> foo = list(expressions(sugary(foo))) [examples showing how much nicer it makes type annotation in ctypes and PyObjC] > BTW (I have this patch not yet applied), is it possible to use more > than > one line, in this way? > > def function(arg1, arg2, arg3, arg4, arg5, arg6) > [dothis, dothat, doanother]: > > All in all, I'm +1 on the patch. No, that is not valid syntax with the current patch.. you would need: def function(arg1, arg2, arg3, arg4, arg5, arg6 ) [dothis, dothat, doanother]: or def function(arg1, arg2, arg3, arg4, arg5, arg6) [ dothis, dothat, doanother]: (or some variation, that makes it obvious to Python that the def is not complete). -bob |
From: Barry W. <ba...@py...> - 2004-02-24 15:51:12
|
On Wed, 2004-02-18 at 21:26, Bob Ippolito wrote: > the latest version of mwh's patch is here: > http://starship.python.net/crew/mwh/hacks/meth-syntax-sugar-3.diff Does anybody else have problems applying this patch? I get: % patch < meth-syntax-sugar-3.diff patch: **** File Grammar is not a regular file -- can't patch Grammar/Grammar sure seems like a regular file to me though. Standard RH9 patch(1), v 2.5.4. Above patch snagged with wget. -Barry |
From: Sjoerd M. <sj...@ac...> - 2004-02-24 22:59:29
|
Barry Warsaw wrote: > On Wed, 2004-02-18 at 21:26, Bob Ippolito wrote: > > >>the latest version of mwh's patch is here: >>http://starship.python.net/crew/mwh/hacks/meth-syntax-sugar-3.diff > > > Does anybody else have problems applying this patch? I get: > > % patch < meth-syntax-sugar-3.diff > patch: **** File Grammar is not a regular file -- can't patch > > Grammar/Grammar sure seems like a regular file to me though. Standard > RH9 patch(1), v 2.5.4. Above patch snagged with wget. Try patch -p0. Patch removes directory names by default. -- Sjoerd Mullender <sj...@ac...> |
From: Barry W. <ba...@py...> - 2004-02-24 16:20:37
|
On Tue, 2004-02-24 at 11:14, Sjoerd Mullender wrote: > Try patch -p0. Patch removes directory names by default. Blah. D'uh. Thanks. -B |