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  -  [EMAIL PROTECTED]
http://mail.python.org/mailman/listinfo/tutor

Reply via email to