open_file#
- open_file(path_arg, mode='r')[source]#
Decorator to ensure clean opening and closing of files.
- Parameters:
- path_argstring or int
Name or index of the argument that is a path.
- modestr
String for opening mode.
- Returns:
- _open_filefunction
Function which cleanly executes the io.
Notes
Note that this decorator solves the problem when a path argument is specified as a string, but it does not handle the situation when the function wants to accept a default of None (and then handle it).
Here is an example of how to handle this case:
@open_file("path") def some_function(arg1, arg2, path=None): if path is None: fobj = tempfile.NamedTemporaryFile(delete=False) else: # `path` could have been a string or file object or something # similar. In any event, the decorator has given us a file object # and it will close it for us, if it should. fobj = path try: fobj.write("blah") finally: if path is None: fobj.close()
Normally, we’d want to use “with” to ensure that fobj gets closed. However, the decorator will make
path
a file object for us, and using “with” would undesirably close that file object. Instead, we use a try block, as shown above. When we exit the function, fobj will be closed, if it should be, by the decorator.Examples
Decorate functions like this:
@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