在Python中返回none的recursion函数

我有这段代码,由于某种原因,当我尝试返回path时,我得到None:

def get_path(dictionary, rqfile, prefix=[]): for filename in dictionary.keys(): path = prefix+[filename] if not isinstance(dictionary[filename], dict): if rqfile in str(os.path.join(*path)): return str(os.path.join(*path)) else: get_path(directory[filename], rqfile, path) 

有没有办法解决这个问题? 提前致谢。

您需要返回recursion结果:

 else: return get_path(directory[filename], rqfile, path) 

否则该函数只是在执行该语句之后结束,导致None返回。

你可能想要放弃 else:并且总是在最后返回:

 for filename in dictionary.keys(): path = prefix+[filename] if not isinstance(dictionary[filename], dict): if rqfile in str(os.path.join(*path)): return str(os.path.join(*path)) return get_path(directory[filename], rqfile, path) 

因为如果rqfile in str(os.path.join(*path))False那么你不用return就结束你的函数。 如果在这种情况下recursion是不正确的select,但返回None不是,你也需要处理该边界。

虽然我认为Martijn Pieters在回答中回答了主要问题(您需要从recursion案例中返回),但我不认为他的build议代码是正确的。

您正在尝试在嵌套dictionary词典中实现深度优先searchrqfile值。 但是你当前的代码不能正确处理recursion的情况。 如果在其recursion调用中发现结果,或者recursion调用未能find目标,则需要进行适当的响应。

以下是我认为您需要的内容,有些内容为了清晰起见而被重新命名或重新排列:

 def get_path(directory, rqfile, prefix=[]): for filename, value in directory.items(): path_list = prefix + [filename] if not isinstance(value, dict): # base case path = os.path.join(*path_list) if rqfile in path: # Found the file. Do you want to do something return path # with the value here, or is it junk? else: # recursive case try: return get_path(value, rqfile, path_list) # this only returns if except ValueError: # the recursion doesn't raise pass raise ValueError("Requested file not found") # not found here or in children 

用法示例:

 >>> directory = {"a": "a info", "b": {"c": "b/c info", "d": "b/d info"}, "e": {"f": "e/f info", "g": {"h": "e/g/h info"}}} >>> print(get_path(directory, "h")) e\g\h >>> print(get_path(directory, r'g\h')) e\g\h 

如果不想在find文件时引发exception,则可以在最后一行的位置返回一个像None一样的标记值,并在recursion情况下检查它的标记值,而不是try / except

  result = get_path(value, rqfile, path) if result is not None: return result