[Edu-sig] Factory functions: synthesizing top-level names

kirby urner kirby.urner at gmail.com
Thu May 27 20:03:03 CEST 2010


On Thu, May 27, 2010 at 3:15 AM, Andre Roberge <andre.roberge at gmail.com> wrote:
>
>
> On Thu, May 27, 2010 at 2:52 AM, kirby urner <kirby.urner at gmail.com> wrote:
>>
>> >
>> > Much appreciated André!
>
> It was a fun challenge.
>  :-)
>>
>> >
>> > I think our solutions are similar:
>> >
>>
>> ... yours is better though, in that you don't make use of exec.
>>
>> My use of it was superfluous.
>>
>> Changing my solution, in light of yours:
>>
>> #===
>>
>> def makeroot(N):
>>   try:
>>       assert type(N)==type(1) and N>=0
>>   except:
>>       raise ValueError("0 <= N <= integer")
>>
>>   fname = "root" + str(N)
>>
>>   if N==0:
>>       globals()[fname] = lambda x: pow(x, 0)
>>   else:
>>       globals()[fname] = lambda x: pow(x, float(1)/N)
>>
>>
>> for i in range(11):
>>    makeroot(i)
>>
>> #===
>>
>
> Technically, your use of globals() instead of locals(), like I did, is
> better, in that it allows you to have it inside a function body, and still
> be available at the module level, as per your stated goal.
>
> However, I find the use of lambda to be too restrictive, in principle, as it
> obviously works only for expressions, and not complex functions.  If this
> example is to be used as a prototype to show students how to do this kind of
> name assignment, then the way I have done it with an inner named function
> (which I first learned about *years* ago, from a post from you on edu-sig!
> I believe it was
> http://mail.python.org/pipermail/edu-sig/2005-March/004590.html) is a better
> way to go.
>
>>
>> Kirby
>

Yes sir, I agree.  The Python lambda is weak (on purpose) in not providing
for full scale anonymous functions.  Binding to the function object returned
by an inner function def is a more liberal strategy, allows for more
complexity.

This thread will document these suggestions and nuances.

Kirby


More information about the Edu-sig mailing list