for os.walk onerror return 的函数去哪儿了?如何向 onerror 函数调用添加更多参数?

Where does the function for os.walk onerror return to? How do I add more arguments to the onerror function call?

我正在编写一个程序来使用 os.walk 遍历文件系统。

我的 for 循环使用 os.walk,onerror 函数如下:

def walk_error(os_error):

    return(os_error)

def main():

    for root, dirs, files in os.walk('/var/spool/cron/', onerror=walk_error):

    print(root, dirs, files)

onerror 函数中的 return 语句去哪里了?我如何引用它?我当然可以在我的 walk_error 函数中执行 print(os_error),它会正常工作。 但我想将该错误保存在某处。

比如说,我如何将一个列表作为参数添加到错误处理函数中,以便我可以将该错误附加到失败目录的列表中?

例如:

def walk_error(os_error, list_of_errors):
    list_of_errors.append(os_error)

那就太好了!但不幸的是,您似乎无法在 onerror 调用中使用多个参数进行这种类型的函数调用。

或者我如何将 returned 值分配给变量以在我的主函数中执行此操作? os_error 被 "returned" 但它没有被 return 编辑到 os.walk 生成的 3 个元组中的任何一个。有没有办法在 main() 中引用 returned 值?

如何在这里进行更复杂的错误处理?

使用内部函数(又名闭包):

def main():

    list_of_errors = []

    def walk_error(os_error):
        list_of_errors.append(os_error)

    for root, dirs, files in os.walk('/var/spool/cron/', onerror=walk_error):
        print(root, dirs, files)

您可以使用 lambdafunctools.partial 来实现您的多参数 onerror 函数。

def walk_error(os_error, list_of_errors):
    list_of_errors.append(os_error)

some_list = []

for root, dirs, files in os.walk("some/path", onerror=lambda err: walk_error(err, some_list):
    do_stuff()

import functools

...  # as above

for root, dirs, files in os.walk("some/path", onerror=functools.partial(walk_error, list_of_errors=some_list)):
    do_stuff()