On Tue, Aug 16, 2011 at 1:44 PM, Jeff Peters <span dir="ltr">&lt;<a href="mailto:jeffp@swva.net">jeffp@swva.net</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Hi;<br>
<br>
I am trying to run a function inside a continuing loop, but do not seem to be able to pass any parameters (arguments ) when I do so.<br>
I have placed working and non-working code , with output below.<br>
<br>
## This works:<br>
<br>
def loop(fn ):<br>
    for i in range(5):<br>
        fn(  )<br>
<br>
def this_function(a=&quot; i am not a string&quot;):<br>
    print( a )<br>
<br>
loop(this_function)<br>
<br>
## with output:<br>
&gt;&gt;&gt;<br>
 i am not a string<br>
 i am not a string<br>
 i am not a string<br>
 i am not a string<br>
 i am not a string<br>
&gt;&gt;&gt;<br>
<br>
## But , this does not :<br>
<br>
def loop(fn ):<br>
    for i in range(5):<br>
        fn(  )<br>
<br>
def this_function(a=&quot; i am not a string&quot;):<br>
    print( a )<br>
<br>
loop(this_function(&quot;I am a string&quot;) )  ## note the only change is here<br>
<br>
## With this as output:<br>
<br>
&gt;&gt;&gt;<br>
I am a string<br>
Traceback (most recent call last):<br>
  File &quot;/home/jeff/MyPythonStuff/<u></u>call_sub.py&quot;, line 9, in &lt;module&gt;<br>
    loop(this_function(&quot;I am a string&quot;) )<br>
  File &quot;/home/jeff/MyPythonStuff/<u></u>call_sub.py&quot;, line 4, in loop<br>
    fn(  )<br>
TypeError: &#39;NoneType&#39; object is not callable<br>
&gt;&gt;&gt;<br></blockquote><div><br></div><div>Your loop() function expects the parameter &#39;fn&#39; to be a function that it can then call.</div><div><br></div><div>In your second example, it doesn&#39;t work because you already called the function and is passing as parameter &#39;fn&#39; whatever this_function() returned.</div>
<div><br></div><div><br></div><div><div>&gt;&gt;&gt; type(this_function)</div><div>&lt;type &#39;function&#39;&gt;</div><div><br></div><div>&gt;&gt;&gt; type(this_function(&quot;I am a string&quot;))</div><div>I am a string</div>
<div>&lt;type &#39;NoneType&#39;&gt;</div></div><div><br></div><div>If you really want this design, one way to &quot;fix&quot; it is to change loop() to accept another argument that is going to be passed to the function.</div>
<div><br></div><div>def loop(fn, b):</div><div>  for i in range(5):</div><div>    fn(b)</div><div><br></div><div>Perhaps if you explain what you are trying to accomplish, someone can suggest a better way to design the code.</div>
<div><br></div></div>-- <br>Giovanni Tirloni<br><a href="http://sysdroid.com" target="_blank">sysdroid.com</a><br><br>