关于您的代码的奇怪之处在于,如果将它传递给一个打开的文件,它将关闭它。不好 不管打开该文件的任何代码,都应负责关闭该文件。但是,这会使函数更加复杂:
def awesome_parse(path_or_file): if isinstance(path_or_file, basestring): f = file_to_close = open(path_or_file, 'rb') else: f = path_or_file file_to_close = None try: return do_stuff(f) finally: if file_to_close: file_to_close.close()
您可以通过编写自己的上下文管理器来抽象它:
@contextlib.contextmanagerdef awesome_open(path_or_file): if isinstance(path_or_file, basestring): f = file_to_close = open(path_or_file, 'rb') else: f = path_or_file file_to_close = None try: yield f finally: if file_to_close: file_to_close.close()def awesome_parse(path_or_file): with awesome_open(path_or_file) as f: return do_stuff(f)



