[Tutor] Recursive user input collection problem

christopher.henk at allisontransmission.com christopher.henk at allisontransmission.com
Tue Oct 13 22:54:16 CEST 2009


> I need to collect a couple of integers from a user, but I want to make
> sure that I actually get integers.  I tried this, but subsequent calls
> to the function don't update variable.  I'm not sure this is terribly
> clear - here's the code:
> 
> num_of_articles = 0
> num_of_reviewers = 0
> 
> def getinput(variable,prompt):
>   """
>   Get the input by prompting the user and collecting the response - if 
it is 
>   a non-integer, try again.
>   """
>   variable = 0
>   variable = raw_input(prompt)
> 
>   try:
>     int(variable)
>     return variable
> 
>   except ValueError:
>     print("We need an integer (number) here.")
>     getinput(variable,prompt)
> 
> 
> num_of_articles = getinput(num_of_articles,"Enter number of articles: ")
> num_of_reviewers = getinput(num_of_reviewers,"Enter number of reviewers: 
")
> 
> print(num_of_articles)
> print(num_of_reviewers)
> 
> 
> This works fine if I put in good input, but not if I pass in a bad
> value.  Can anyone show me where I have gone astray?  Thanks.
> -- 
> 
> yours,
> 
> William


When the exception is thrown the "return variable" line is not executed. 
The path jumps down to the except block and runs that.  Thus when you are 
unrolling the recursion the first getinput() does not return a value. 
A finally block after the exception block will execute whether or not the 
exception is thrown after the other code runs. 

You also need to assign the return value of getinput() within your except 
block.

Finally there is no need to pass variable into the function as you 
immediately change it to zero. 

Chris

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20091013/562e8c40/attachment.htm>


More information about the Tutor mailing list