我是 Python 的菜鸟,但我写了一个像这样的自动关闭函数..
@contextmanager
def AutoClose(obj):
try:
yield obj
finally:
obj.Close()
我有三个类具有可以使用此函数的 Close() 方法。这是最 Pythonic 的解决方案吗?我应该在课堂上自己做点什么吗?
我是 Python 的菜鸟,但我写了一个像这样的自动关闭函数..
@contextmanager
def AutoClose(obj):
try:
yield obj
finally:
obj.Close()
我有三个类具有可以使用此函数的 Close() 方法。这是最 Pythonic 的解决方案吗?我应该在课堂上自己做点什么吗?
大多数pythonic解决方案是在你的类中定义方法__enter__
和方法:__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__
将在进入和离开 blocks 时被隐式调用with
。另请注意,它__exit__
允许您捕获块内引发的异常with
。
Functioncontextlib.closing
通常用于那些没有明确定义方法__enter__
和__exit__
(但有方法close
)的类。如果您定义自己的类,更好的方法是定义这些方法。
你正在做的事情看起来非常好,而且是 Pythonic。虽然,contextlib
标准库已经有类似的东西,但你必须将你的Close
方法重命名为close
.
import contextlib
with contextlib.closing(thing):
print thing
我建议改用这个。毕竟,Python 方法的推荐命名约定是all_lowercase_with_underscores
.