在内置的open()函数中使用opener参数有什么用?

时间:2016-05-15 17:52:31

标签: python

我正在使用python 3.5中的open函数。我不了解open函数中opener参数(Last argument)的用法。根据python文档:通过传递一个callable作为开启者可以使用自定义开启器。

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

有人可以借助一个例子向我解释为什么我需要开启者论证。

2 个答案:

答案 0 :(得分:0)

请参阅文档here。他们给出的例子如下:

import os
dir_fd = os.open('somedir', os.O_RDONLY)
def opener(path, flags):
    return os.open(path, flags, dir_fd=dir_fd)

with open('spamspam.txt', 'w', opener=opener) as f:
    print('This will be written to somedir/spamspam.txt', file=f)

os.close(dir_fd)  # don't leak a file descriptor

这个特殊示例的作用是创建一个开启者,它始终采用路径并将它们解释为相对于您选择的给定目录(somedir)。您可以想象使用更复杂的逻辑来查看特定目录,具体取决于文件类型,或者根据文件名的前几个字符将大量文件分成目录结构,并将特定函数编写为将定位它们的开启器。所有这些都将文件定位逻辑封装到单个函数中作为开启者。

答案 1 :(得分:-1)

老实说,我从未在真正的Python代码中使用 opener 参数......

可能的用法是使用需要特殊API的特殊文件系统。例如,您可以将顺序文件存储在数据库中,方法是将整个文件保存在内存中,并在一次操作中读取和写入。

曾经有索引文件,即包含顺序流的文件,每个流都有一个名称。在这种情况下,您可以使用自定义开启工具透明地访问它。

我能想象的最后一个例子是Windows NTFS文件系统中的streams。每个文件都有一个默认流,但可以包含所需的备用流。可以使用特殊的开启工具来访问文件上的透明备用流,或者在打开或关闭时将特殊的元数据存储在特定的备用流中...