什么是Pythonic编写自动关闭类的方法?

时间:2013-08-12 06:33:10

标签: python

我是Python的菜鸟,但是我写了一个这样的自动关闭功能..

@contextmanager
def AutoClose(obj):
    try:
        yield obj
    finally:
        obj.Close()

我有三个类,它们有一个Close()方法,可以使用此函数。这是最恐怖的解决方案吗?我应该在课堂上做些什么吗?

2 个答案:

答案 0 :(得分:9)

大多数pythonic解决方案是在您的类中定义方法__enter__ and __exit__方法:

class Foo(object):
     def __init__(self, filename):
         self.filename = filename

     def __enter__(self):
         self.fd = open(self.filename)

     def __exit__(self, exc_type, exc_value, traceback):
         self.fd.close()

使用:

with Foo('/path/to/file') as foo:
    # do something with foo

进入和离开块__enter__时,将隐式调用方法__exit__with。另请注意,__exit__允许您捕获块with内引发的异常。

函数contextlib.closing通常用于那些未明确定义方法__enter____exit__(但有方法close)的类。如果您定义自己的类,更好的方法是定义这些方法。

答案 1 :(得分:8)

你正在做的事情看起来很完美和Pythonic。虽然contextlib标准库已经有类似的内容,但您必须将Close方法重命名为close

import contextlib
with contextlib.closing(thing):
    print thing

我建议改用它。毕竟,Python方法的推荐命名约定是all_lowercase_with_underscores