[Python-Dev] Shortcut Notation for Chaining Method Calls (original) (raw)
Michael O\'Keefe mokeefe at okeefecreations.com
Sat Feb 3 20:01:47 CET 2007
- Previous message: [Python-Dev] Shortcut Notation for Chaining Method Calls
- Next message: [Python-Dev] Shortcut Notation for Chaining Method Calls
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Michael O'Keefe <mokeefe okeefecreations.com> writes:
I kept playing with this since my last post went live and here is a little more thought on these ideas. After sitting with the "Zen of Python" document (>>> import this), I'm maybe waffling on my previous post already so I came up with a few more options here.
Also, to play the devil's advocate, in terms of pure space, these ideas don't necessarily decrease the total amount of typing (see the length stackup at the end of the post) though they would allow a trade for horizontal typing versus vertical (down the page) typing making for compact looking code.
I suppose what would be nice is an operator which would execute the method indicated at left but then return back the reference to the now modified object. This is given in the desired() function below. Since this object doesn't exist, it can't be demonstrated. The filtered01 and filtered02 functions demonstrate trying to put eval to work -- not crazy about that since it has the added baggage of the globals(), locals() plus the need to write the calls in string format.
Anyhow, just curious for ideas and sparking discussion.
def desired(): pass # IF we had a --> operator which would execute the method at # left but return a ref to object #return [8,9,7,1].sort()-->reverse()-->pop(0)--> # returns [8,7,1] # return [8,9,7,1].sort()-->reverse()-->pop(0) # returns 9 # return [8,9,7,1].sort()-->reverse()-->pop(0) # equivalent to above
def filtered01(): popidx=0 return filter([8,9,7,1],'sort()','reverse()','pop(popidx)',locals=locals())
def filtered02(): return filter([8,9,7,1],'sort()','reverse()').pop(0)
def filter(obj,*args,**kwargs): if 'globals' in kwargs: globals_=kwargs['globals'] else: globals_=globals() if 'locals' in kwargs: locals_ =kwargs['locals'] else: locals_ =locals() locals_.update(locals()) for methodCall in args: eval('obj.%s'%methodCall,globals_,locals_) return obj
print filtered01() # returns [8, 7, 1] print filtered02() # returns 9
LENGTH STACKUP (if all statements put on the same horizontal line)
someFunc():
a=[8,9,7,1]a.sort()a.reverse()a.pop(0)return a
filtered01:
return filter([8,9,7,1],'sort()','reverse()','pop(0)',locals=locals())
explicitReturn():
a=[8,9,7,1].sort().reverse()a.pop(0)return a
newFunc01:
return [8,9,7,1].('sort').('reverse')._('pop',0)
newFunc02:
return [8,9,7,1].self_('sort').self_('reverse').self_('pop',0)
desired:
return [8,9,7,1]-->sort()-->reverse()-->pop(0)-->
- Previous message: [Python-Dev] Shortcut Notation for Chaining Method Calls
- Next message: [Python-Dev] Shortcut Notation for Chaining Method Calls
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]