Python 返回值不返回任何值
我一直在尝试编写一个小应用程序,帮助我管理特定的outlook电子邮件。通过递归搜索,我目前可以根据目录名访问各个目录。然而,我碰到了一个似乎无法克服的小肿块Python 返回值不返回任何值,python,windows,python-3.x,win32com,Python,Windows,Python 3.x,Win32com,我一直在尝试编写一个小应用程序,帮助我管理特定的outlook电子邮件。通过递归搜索,我目前可以根据目录名访问各个目录。然而,我碰到了一个似乎无法克服的小肿块 import win32com.client o = win32com.client.gencache.EnsureDispatch("Outlook.Application").GetNamespace("MAPI") def dfr(folders, indent, tardir): try: for i
import win32com.client
o = win32com.client.gencache.EnsureDispatch("Outlook.Application").GetNamespace("MAPI")
def dfr(folders, indent, tardir):
try:
for i in range(1, folders.Count+1):
run = True
folder = folders[i]
dfr(folder.Folders, indent+1, tardir)
try:
if folder.Name == tardir:
if folder.Name == None:
print(folder.Name)
raise StopIteration
print(folder.Name)
return dfr(folders[i], indent, tardir)
except StopIteration:
break
except UnboundLocalError:
pass
tf = dfr(o.Folders, 0, "Journal")
print(tf)
预期的情况是,函数将递归搜索outlook,直到在函数调用中找到指定的目录,在本例中为“Journal”。函数找到它,并在那里停止。因为该函数不打印(文件夹),所以我知道它会在日志中停止。但是,当我尝试返回文件夹时,它不会返回正确的值,并且等于“无”
我不需要从这个函数返回其他三个变量,因为它们只用于导航
有什么建议吗
编辑:对以下评论的回复
我不知道win32comapi,但是如果你想进行深度优先搜索,你可以尝试这样的方法
def dfr(folders, tardir):
for folder in folders: # if `folder` follows python convention, it should be iterable.
if folder.Name == tardir: # is it the correct folder?
return folder
match = dfr(folder.Folders, tardir) # recurse into child folders
if match:
# return result from recursive call of dfr() if successful
# This was missing in your code, which is why it returns None
return match
tf = dfr(o.Folders, "Journal")
print(tf)
函数返回None的原因是,如果文件夹名称匹配,则只返回
值。但由于这可能发生在递归的几个层次,因此还必须将结果沿堆栈向上传播到初始调用方。如果您不这样做,python函数默认返回None
。dfr(folder.Folders,indent+1,tardir)
=>返回dfr(folder.Folders,indent+1,tardir)
您有不返回任何内容的异常处理分支。你必须在那里返回一些东西,或者使异常不会发生。这在很多方面都是草率的。您的for
循环应该是文件夹中的for f:
并且嵌套的try块没有任何用途。考虑一个完整的改写,你能纠正你的缩进吗?def
之后没有缩进块,因此这不是有效的python语法。倒数第二行还有一个缩进级别,与其他任何内容都不匹配。你能给出一个完整的例子吗?我们不知道什么是o.Folders
,也不知道它是从哪里来的。提供的答案似乎有错误类型RecursionErrors。我相信这是因为每个文件夹中都有项目,在这种情况下,它们就是电子邮件<代码>递归错误:超过最大递归深度
我输入了一个错误,导致无限递归。请尝试更正的代码。谢谢!!我很欣赏这些笔记,它们从根本上帮助我理解我做错了什么。
def dfr(folders, tardir):
for folder in folders: # if `folder` follows python convention, it should be iterable.
if folder.Name == tardir: # is it the correct folder?
return folder
match = dfr(folder.Folders, tardir) # recurse into child folders
if match:
# return result from recursive call of dfr() if successful
# This was missing in your code, which is why it returns None
return match
tf = dfr(o.Folders, "Journal")
print(tf)