[Tutor] using a function as a dictionary value?
justinstraube at charter.net
justinstraube at charter.net
Mon Dec 13 19:16:33 CET 2004
Thanks Liam and Kent!
Regards,
Justin
On Mon, 13 Dec 2004 07:57:45 -0500, you wrote:
>
>Liam Clarke wrote:
>> Hey Justin,
>>
>> Tricky one this..
>>
>> as far as I know, and I'm a beginner myself, a dictionary stores a
>> reference to the function, not the actual function.
>
>Yes. In fact this is a good way to think about all variables in Python. A
variable stores a
>reference to a value, not the value itself. I think of variables as somehow
pointing at the value.
>Some people like to think of the variable as a sticky note stuck on the value
with its name.
>Pythonistas say that the name is 'bound' to the value; the assignment 'x = 2'
binds the name 'x' to
>the value '2'.
>
>The *wrong* way to think about variables in Python is to think of them as
containers that hold a
>value. This is appropriate for some languages but it is not a helpful model
for Python.
>
>> So -
>>
>>
>>>command = {'1': spam(),
>>> '2': breakfast(),
>>> '3': bridgekeeper()
>>> }
>>
>>
>> Try this instead -
>>
>> command = {'1': spam, '2':breakfast, '3': bridgekeeper}
>
>Yes. The difference is, you are storing a reference to the actual function
object, rather than the
>result of calling the function.
>
> >>> def foo():
>... return 3
>...
>
>The function name is actually a variable which is bound to a function object.
When you use the bare
>variable name, you are referring to this object:
> >>> foo
><function foo at 0x008D6670>
>
>On the other hand when you use the function name with parentheses, you call
the function. The value
>of this expression is the return value of the function.
>
> >>> foo()
>3
>
>Here is a dictionary with both usages:
> >>> d = { 'foo':foo, 'value':foo() }
> >>> d
>{'foo': <function foo at 0x008D6670>, 'value': 3}
>
>If you put foo in the dict, you have access to the function. If you put foo()
in the dict, you have
>access to the result of calling the function. If I store a reference to the
function, I can retrieve
>it and call it like this:
> >>> d['foo']()
>3
>
>Kent
>
>>>if select in options:
>>> command[select]
>>
>>
>> change this to -
>>
>> select = raw_input('Chose an option [1|2|3]: ')
>>
>> if select in command.keys():
>> command[select]()
>>
>>
>>
>> That one had me going round in circles when I first met it.
>> AFAIK, everything is stored in dictionaries apparently. If you have a
>> function called 'dude()' you could probably call it as a dictionary of
>> 'dude' from the namespace...
>
>Yes, under the hood, binding a name to a value turns into adding a mapping to
a special dictionary.
>For variables with global scope, you can access this dictionary with the
globals function. Both the
>dict d and the function foo are in my globals:
>
> >>> globals()
>{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__',
'foo': <function foo at
>0x008D6670>, '__doc__': None, 'd': {'foo': <functi
>on foo at 0x008D6670>, 'value': 3}}
> >>> globals()['d']
>{'foo': <function foo at 0x008D6670>, 'value': 3}
>
>>
>> Standard disclaimer -
>>
>> Someone more knowledgable would probably be along shortly to point out
>> a simpler, elegant way to do it, but my way works. Mostly.
>
>Actually you got the code right :-) I just thought the explanation needed a
little fleshing out.
>
>Kent
>_______________________________________________
>Tutor maillist - Tutor at python.org
>http://mail.python.org/mailman/listinfo/tutor
regards,
Justin
---
You may have noticed, Im not all there myself.
-Cheshire Cat
More information about the Tutor
mailing list