a = b = 1 just syntactic sugar?
staschuk at telusplanet.net
Sun Jun 8 08:27:29 CEST 2003
> If you care, I wrote a little function that will return the current
> function within a block. This means, you can have anonymous recursive
> functions like this:
> import selfref
> factorial = lambda x: ((x==0)*1) or (x * selfref.myself(x-1))
This is certainly clever, but imho good style demands writing even
so simple and familiar a function more directly. Besides the
simple loss of clarity, I don't see how (without helper functions
defined more sensibly) you'd add a check to the above that x >= 0
(raising a ValueError if it isn't). Or a docstring, for that
I can't think offhand of a useful recursive function simple enough
to be clear when written this way; in other words, I can't think
of a case where I'd actually use this.
> Here is the code:
> def myself(*args):
> prevFrame = sys._getframe(1)
> myOwnCode = prevFrame.f_code
> myOwnFuncObj = new.function(myOwnCode, globals())
> return myOwnFuncObj(*args)
> The only thing this doesn't do is to capture default arguments!!!
I don't see the problem with default arguments:
>>> f = lambda a, b=5: (b<1 and 1 or a*selfref.myself(a, b-1))
Am I missing something?
Keyword arguments are definitely missing, of course, but that lack
is easily remedied:
def myself(*args, **kwargs):
prevFrame = sys._getframe(1)
myOwnCode = prevFrame.f_code
myOwnFuncObj = new.function(myOwnCode, globals())
return myOwnFuncObj(*args, **kwargs)
I'm fairly sure you don't want to use globals() here, though.
>>> import selfref
>>> x = 3
>>> f = lambda n: n < 1 and 1 or x + selfref.myself(n-1)
Traceback (most recent call last):
NameError: global name 'x' is not defined
What you want is, I expect, prevFrame.f_globals.
Steven Taschuk staschuk at telusplanet.net
"I may be wrong but I'm positive." -- _Friday_, Robert A. Heinlein
More information about the Python-list