¿Por qué mi función de Python recursiva devuelve Ninguna?

Tengo esta función que se llama a sí misma:

def get_input(): my_var = input('Enter "a" or "b": ') if my_var != "a" and my_var != "b": print('You didn\'t type "a" or "b". Try again.') get_input() else: return my_var print('got input:', get_input()) 

Ahora, si ingreso solo “a” o “b”, todo funciona bien:

 Type "a" or "b": a got input: a 

Pero, si escribo algo más y luego “a” o “b”, obtengo esto:

 Type "a" or "b": purple You didn't type "a" or "b". Try again. Type "a" or "b": a got input: None 

No sé por qué get_input() está devolviendo None , ya que solo debería devolver my_var . ¿De dónde viene esta None y cómo arreglo mi función?

Está devolviendo None porque cuando lo recursivamente lo llamas:

 if my_var != "a" and my_var != "b": print('You didn\'t type "a" or "b". Try again.') get_input() 

..you no devuelve el valor.

Entonces, mientras se produce la recursión, el valor de retorno se descarta, y luego se cae del final de la función. La caída del final de la función significa que Python devuelve implícitamente None , así:

 >>> def f(x): ... pass >>> print(f(20)) None 

Entonces, en lugar de solo llamar a get_input() en tu sentencia if , debes return :

 if my_var != "a" and my_var != "b": print('You didn\'t type "a" or "b". Try again.') return get_input() 

Para devolver un valor que no sea Ninguno, debe utilizar una statement de devolución.

En su caso, el bloque if solo ejecuta una devolución al ejecutar una twig. Mueva la devolución fuera del bloque if / else, o haga devoluciones en ambas opciones.

 def get_input(): my_var = input('Enter "a" or "b": ') if my_var != "a" and my_var != "b": print('You didn\'t type "a" or "b". Try again.') return get_input() else: return my_var print('got input:', get_input()) 

Creo que deberías usar mientras bucles .

 if my_var != "a" and my_var != "b": print('You didn\'t type "a" or "b". Try again.') get_input() 

Considere que escribe algo diferente a “a” y “b”, por supuesto, se llamará get_input pero luego se get_input la siguiente parte. Cual es:

 else: return my_var 

E irá directamente a:

 print('got input:', get_input()) 

Por lo tanto, si usas while loop como:

 while my_var!="a" and my_var!="b": print('You didn\'t type "a" or "b". Try again.') return get_input() 

De esta manera creo que puedes manejarlo.