On Sun, 03 Apr 2005 05:09:07 GMT, Ron_Adam <[EMAIL PROTECTED]> wrote:
>On 2 Apr 2005 20:02:47 -0800, "El Pitonero" <[EMAIL PROTECTED]> >wrote: > >>Ron_Adam wrote: >>> >>> So I didn't know I could do this: >>> >>> def foo(a1): >>> def fee(a2): >>> return a1+a2 >>> return fee >>> >>> fum = foo(2)(6) <------ !!! >> >>Ah, so you did not know functions are objects just like numbers, >>strings or dictionaries. I think you may have been influenced by other >>languages where there is a concept of static declaration of functions. > >No, I did not know that you could pass multiple sets of arguments to That phraseology doesn't sound to me like your concept space is quite isomorphic with reality yet, sorry ;-) It sounds like you are thinking of "multiple sets of arguments" as an aggregate that is passed as such, and that isn't happening, as I believe El Pitonero is trying to indicate with his parenthesized visualization below. What is happening is that an expression "foo(2)(6)" is being evaluated left to right. First foo as a name evaluates to whatever it is bound to, which is the foo function. Then () is the calling operator, which says evaluate the list inside the parens left to right and call the thing you had so far, which was foo here. The arg list was just 2, so foo is called with 2, and foo returns something, with which we will do the next operation if there is one. If the next operation was "." (i.e., attribute getting) the next thing following would have had to be an attribute name, e.g. like func_name. foo(2).func_name would evaluate to the same as fee.func_name for the fee returned by foo(2). But we are not doing .func_name, we are doing (6) as the next operation in the left-to-right evaluation of the expression. And whatever we have at the foo(2) stage, the (6) means we should take it and call it with 6 as an argument. So if you are seeing (2)(6) as something to pass, as opposed to a sequence of operations, I think there's a misconception involved. Perhaps I am taking your words askew ;-) >nested defined functions in that manner. Just haven't ran acrossed it >in the two years I've been playing around with python. I haven't had a >reason to try it either. But maybe now that I'm aware of it, I'll >find more uses for it. > > > >>The last line can be better visualized as: >> >>fum = (foo(2)) (6) >> >>where foo(2) is a callable. >> That's clear to me, anyway ;-) The code shows it too: >>> import dis, compiler >>> dis.dis(compiler.compile('foo(2)','','eval')) 1 0 LOAD_NAME 0 (foo) 3 LOAD_CONST 1 (2) 6 CALL_FUNCTION 1 9 RETURN_VALUE The (6) just calls whatever the result of the preceding was >>> dis.dis(compiler.compile('foo(2)(6)','','eval')) 1 0 LOAD_NAME 0 (foo) 3 LOAD_CONST 1 (2) 6 CALL_FUNCTION 1 9 LOAD_CONST 2 (6) 12 CALL_FUNCTION 1 15 RETURN_VALUE HTH Regards, Bengt Richter -- http://mail.python.org/mailman/listinfo/python-list