Python递归函数未返回值
这是我在这里的第一个问题,如果我写得太多了,我深表歉意,非常感谢你们抽时间来看。
问题:
我写了一个函数,它应该在必要时调用自己x次,如果没有成功就返回空值。但是,当这个函数看起来成功时,它仍然返回None。
背景:我有一些文件夹,代表2009年的月份。不过,并不是所有的月份都有,所以如果某个月份不存在,我想获取上一个月份,检查那个月份的文件夹是否存在,如果不存在,最多再往回查找一个月,最多查6个月。
在下面的日期标签中,你会看到09这个月份,在我的测试案例中它并不存在。08和07也不存在。因此,这个函数应该返回06,但它却返回了None。
import pdb
import generate_months_module
import os
date_tag = '2000/2000/2009/09'
tree_location = '/Users/kelly/Documents/projects/komm/data/directory-tree/'
def iterateOverMonths(date_tag, x):
if x <= 0:
return_string = 'no dates found'
return return_string
else:
new_date = generate_months_module.handleDateShifts(date_tag)[1]
print '\tNEW DATE after calling handleDateShifts' + new_date
full_path = tree_location + '/' + new_date
if checkDirectoryExistance(full_path) == True:
print '\t'+ full_path + ' is a real path'
return full_path
else:
print 'dir does not exist'
iterateOverMonths(new_date, x-1)
def checkDirectoryExistance(dir_path):
"check if a directory exists, return true or false"
if os.path.isdir(dir_path) == True:
return True
else:
return False
print iterateOverMonths(date_tag, 6)
generate_months_module.handleDateShifts这个函数应该只是获取上一个月份并返回它。(在其他测试案例中这个功能是正常的,所以我非常怀疑问题出在这里!)
然后我的输出是:
6
NEW DATE after calling handleDateShifts2000/2000/2009/08
dir does not exist
5
NEW DATE after calling handleDateShifts2000/2000/2009/07
dir does not exist
4
NEW DATE after calling handleDateShifts2000/2000/2009/06
/Users/kelly/Documents/projects/komm/data/directory-tree/2000/2000/2009/06 is a real path
returning full path
None
当我在“return full_path”之前使用pdb.set_trace()时,似乎这个函数被再次调用,尽管IF条件为真,因此覆盖了我想要返回的“full_path”变量。
为什么路径“/Users/kelly/Documents/projects/komm/data/directory-tree/2000/2000/2009/06”没有被返回??
导入的函数:
如果有人感兴趣并想要重现这个,handleDateShifts函数如下(抱歉,它有点乱):
def handleDateShifts(corpus_date_string):
"get background corpus date strings ALSO call this function if month does not exist and need to go back even further"
century, decade, year, month = corpus_date_string.split('/')
if month == '01' or month == '02':
#handle date boundaries which can affect year, decade and cent
background_mo_1 = '11'
background_mo_2 = '12'
millenium_shift = re.search('[1-9][0][0][0]$', year)
century_shift = re.search('[1-9][0][0]$', year)
decade_shift = re.search('[1-9][0]$',year)
if century_shift or millenium_shift:
century = int(year) - 100
decade = int(year) - 10
year = int(year) - 1
elif decade_shift:
decade = int(year) - 10
year = int(year) - 1
elif not decade_shift and not century_shift:
year = int(year) - 1
background_1_string = str(century) +'/'+ str(decade) +'/'+ str(year) +'/'+ str(background_mo_1)
background_2_string = str(century) +'/'+ str(decade) +'/'+ str(year) +'/'+ str(background_mo_2)
else: #the cent/dec/year can stay the same
background_mo_1 = int(month) - 2
background_mo_2 = int(month) - 1
if len(str(background_mo_1)) == 1:
background_mo_1 = '0' + str(background_mo_1)
if len(str(background_mo_2)) == 1:
background_mo_2 = '0' + str(background_mo_2)
background_1_string = str(century) +'/'+ str(decade) +'/'+ str(year) +'/'+ str(background_mo_1)
background_2_string = str(century) +'/'+ str(decade) +'/'+ str(year)+'/'+ str(background_mo_2)
return background_1_string, background_2_string
1 个回答
1
在这个分支中你没有返回任何东西(你的结果就丢失了):
else:
print 'dir does not exist'
iterateOverMonths(new_date, x-1)
如果函数执行完毕没有明确写 return <smth>
,那么它会返回 None
。