返回值 returns None

Returning value returns None

我一直在尝试编写一个小应用程序来帮助我管理特定的 Outlook 电子邮件。我目前可以通过递归搜索来根据名称访问各个目录。然而,我遇到了一个我似乎无法克服的小颠簸。

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"。该函数找到它,并停在那里。因为该函数执行 print(folder) 我知道它在日志处停止。但是,当我尝试 return 文件夹时,它没有 return 正确的值,而是等同于 None.

我不需要 return 此函数的其他三个变量,因为它们仅用于导航..

有什么建议吗?

编辑:对以下评论的回应

Printout when recursively searching through the folders.

import win32com.client

o = win32com.client.gencache.EnsureDispatch("Outlook.Application").GetNamespace("MAPI")

def dfr(folders, indent, tardir):
    for i in range(1, folders.Count+1):
        run = True
        folder = folders[i]
        print('%sFolder %d: "%s"' %('\t'*indent,i,folder.Name))
        dfr(folder.Folders, indent+1, tardir)
        if folder.Name == tardir:
            if folder.Name == None:
                print(folder.Name)
                break
            print(folder.Name)
            return folder

tf = dfr(o.Folders, 0, "Journal")

print(tf)

我不知道 win32com api,但是如果你想做深度优先搜索,你可以试试这样的东西。

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)

你的函数 returns None 的原因是你只 return 如果文件夹名称匹配。但由于这可能发生在递归的多个层次深处,因此您还必须将结果向上传播到堆栈的初始调用者。如果您不这样做,python 默认运行 return None