Seth
Seth

Reputation: 13

Python 3.x - Input only returns first item

I have been having problems with a block of code in a little project and I can't seem to fix it.

In the below code, I define inputrace() so that a process is carried out where the player types in a number that is above 0 and below 13 (there are 12 choices, each dictated by a number); it also checks for blank lines and strings and has the program state that there is an error and ask for user input again if they are detected. If it passes the check, RaceInp is returned and set to RaceChoice which allows the code below it to assign a Race to the player based on their selection.

#race check
def inputrace():
    print ("Input number")
    RaceInp = input()
    Check = RaceInp
    try:
        int(RaceInp)
    except ValueError:
        print("Numbers only!")
        inputrace()
    if not int(Check)>12 or int(Check)<1:
            return RaceInp
            print (RaceInp) #this is here so I can check the value returned
Race = "NA"
RaceChoice = inputrace()
print (RaceChoice)
#assign race
if RaceChoice == "1":
    Race = "Human"
#continues down to twelve

Everything works when valid strings are put in (any number 1-12), but things break when I purposefully put in an invalid string. It seems like RaceInp only retains the first user input and does not change, even after the function is recalled from an error. That means if I were to put in "a," the program will tell me it is wrong and ask again. However, when I put in "1" in an attempt to correct it, it accepts it but still keeps RaceInp as "a." Is there any fix to this? I have no clue what's going on.

I appreciate the help and sorry if I got anything wrong in the question!

Upvotes: 1

Views: 50

Answers (1)

ScottWilson
ScottWilson

Reputation: 370

It seems that the problem is that you put the inputrace in a recursion instead of a loop. Something like this would probably be better:

def input_race():
    while True:
        print("Input a number between 1 and 12.")
        race_input = input()

        try:
            race_input = int(race_input)

            if race_input >= 1 and race_input <= 12:
                return race_input

        except ValueError:
            pass

        print ("'{input}' is not a number.".format(input=race_input))


race = "NA"
race_choice = input_race()

if race_choice == 1:
    race = "Human"

print(race)

Upvotes: 1

Related Questions