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