我是Python的菜鸟,但是我写了一个这样的自动关闭功能..
@contextmanager
def AutoClose(obj):
try:
yield obj
finally:
obj.Close()
我有三个类,它们有一个Close()方法,可以使用此函数。这是最恐怖的解决方案吗?我应该在课堂上做些什么吗?
答案 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
。