Cómo detener la recursión de python

Hice una función que busca archivos de forma recursiva y quiero que se detenga cuando se encuentre el primer archivo:

def search_file(path): for name in os.listdir(path): sub = os.path.join(path, name) if os.path.isfile(sub): return sub#And break recursion else: search_file(sub) 

Devuelve una bandera que dice si el archivo fue encontrado. Cuando llame a search_file , devuelva si el valor devuelto es True.

Estás cerca. Ya rompe la recursión cuando encuentra el archivo, el problema es que no propugnó ese resultado en toda la cadena. Una statement impresa bien colocada mostraría lo que salió mal.

 import os def search_file(path): for name in os.listdir(path): sub = os.path.join(path, name) print('peek at: {}'.format(sub)) if os.path.isfile(sub): return sub#And break recursion else: sub = search_file(sub) if sub: return sub print(search_file('a')) 

Tenga en cuenta que debe poder devolver una entrada falsa en caso de que se desplace completamente hacia abajo sin encontrar nada. Sin embargo, no desea salir del bucle for si no se encuentra nada en un subdirectorio sin verificar el siguiente subdirectorio. La devolución saldrá de la función y devolverá los resultados sin tener que ingresar una pausa.

 def search_file(path): Initialize results to no file found val = False sub = None for name in os.listdir(path): sub = os.path.join(path, name) val = os.path.isfile(sub): if val: return val, sub #And break recursion else: #check the subdirectory. val, sub = search_file(sub) # Break out if a valid file was found. if val: return val, sub # No files found for this directory, return a failure return val, sub 

Por otro lado, si desea tener solo una devolución, puede usar un descanso de la siguiente manera

 def search_file(path): Initialize results to No file found val = False sub = None for name in os.listdir(path): sub = os.path.join(path, name) val = os.path.isfile(sub): if val: break # break out of the for loop and return else: #check the subdirectory. val, sub = search_file(sub) # Break out if a valid file was found. if val: break # Return the True or False results return val, sub 

Veo un problema de no poder devolver un valor que None sea None una vez en la instrucción else: ¿Podría proporcionar detalles más amplios que describan lo que está tratando de hacer?

No hay manera de simplemente salir de la recursión cuando realiza una tarea. Cada paso recursivo que se abrió debe cerrarse antes de continuar. La función debe devolver algo ( None o un valor) a su llamador.

Me imagino que esto es un método de clase que establece el valor en un atributo porque no devuelve nada una vez que la recursión ha comenzado. Esto es lo que haría en el caso de que este sea un método de clase .

 def search_file(self, path): for name in os.listdir(path): sub = os.path.join(path, name) if os.path.isfile(sub): self.random_attr = sub return True #And break recursion elif search_file(sub): break