open_file#

open_file(path_arg, mode='r')[source]#

确保文件打开和关闭的装饰器。

Parameters:
path_arg字符串或整数

作为路径的参数的名称或索引。

mode字符串

打开模式字符串。

Returns:
_open_file函数

能够干净地执行io的函数。

Notes

注意,此装饰器解决了当路径参数以字符串形式指定时的问题,但它不处理函数希望接受默认值为None(然后处理它)的情况。

以下是如何处理这种情况的示例:

@open_file("path")
def some_function(arg1, arg2, path=None):
    if path is None:
        fobj = tempfile.NamedTemporaryFile(delete=False)
    else:
        # `path` 可能是字符串、文件对象或其他类似的东西。
        # 无论如何,装饰器已经为我们提供了一个文件对象,
        # 并且如果需要,它将为我们关闭它。
        fobj = path

    try:
        fobj.write("blah")
    finally:
        if path is None:
            fobj.close()

通常,我们会使用 “with” 来确保 fobj 被关闭。 然而,装饰器会将 path 变成一个文件对象给我们, 使用 “with” 会不必要地关闭那个文件对象。 相反,我们使用 try 块,如上所示。 当我们退出函数时,装饰器会根据需要关闭 fobj。

Examples

装饰函数如下:

@open_file(0, "r")
def read_function(pathname):
    pass

@open_file(1, "w")
def write_function(G, pathname):
    pass

@open_file(1, "w")
def write_function(G, pathname="graph.dot"):
    pass

@open_file("pathname", "w")
def write_function(G, pathname="graph.dot"):
    pass

@open_file("path", "w+")
def another_function(arg, **kwargs):
    path = kwargs["path"]
    pass