返回值返回无

时间:2018-03-16 14:57:42

标签: 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 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"。该函数找到它,然后停在那里。因为该函数确实打印(文件夹)我知道它在期刊停止。但是,当我尝试返回文件夹时,它不会返回正确的值并等同于无。

我不需要从此功能返回其他三个变量,因为它们仅用于导航..

有什么建议吗?

编辑:回复以下评论

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)

1 个答案:

答案 0 :(得分:2)

我不知道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)

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