Python 返回值不返回任何值

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

我一直在尝试编写一个小应用程序,帮助我管理特定的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”。函数找到它,并在那里停止。因为该函数不打印(文件夹),所以我知道它会在日志中停止。但是,当我尝试返回文件夹时,它不会返回正确的值,并且等于“无”

我不需要从这个函数返回其他三个变量,因为它们只用于导航

有什么建议吗

编辑:对以下评论的回复


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