在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