7

我是 Python 的菜鸟,但我写了一个像这样的自动关闭函数..

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

我有三个类具有可以使用此函数的 Close() 方法。这是最 Pythonic 的解决方案吗?我应该在课堂上自己做点什么吗?

4

2 回答 2

12

大多数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)的类。如果您定义自己的类,更好的方法是定义这些方法。

于 2013-08-12T06:51:56.547 回答
8

你正在做的事情看起来非常好,而且是 Pythonic。虽然,contextlib标准库已经有类似的东西,但你必须将你的Close方法重命名为close.

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

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

于 2013-08-12T06:36:57.250 回答