0

在 Ruby 中,我可以说:

def get_connection
  db = connect_to_db()
  yield
  db.close()
end

然后调用它

get_connection do
  # action1.....
  # action2.....
  # action3.....
end

在 Python 中我不得不说

def get_connection(code_block):
  db = connect_to_db()
  code_block()
  db.close()

get_connection(method1)

def method1():
   # action1.....
   # action2.....
   # action3.....

这不方便,因为我必须创建一个额外的method1. 请注意,这method1可能很大。有没有办法在 Python 中模拟 Ruby 的匿名块?

4

1 回答 1

4

是的。使用'with'语句:

使用类

class get_connection(object):
    def __enter__(self):
        self.connect_to_db()
    def __exit__(self, *args, **kwargs):
        self.close()
    def some_db_method(self,...):
        ...

并像这样使用它:

with get_connection() as db:
    db.some_db_method(...)

这将执行以下操作:

 self.connect_to_db()
 db.some_db_method(...)
 self.close()

看看这里:http ://docs.python.org/release/2.5/whatsnew/pep-343.html 。您可以使用 by 的参数__exit__来处理with语句中的异常等。

使用函数

from contextlib import contextmanager

@contextmanager
def db_connection():
    db = connect_to_db()
    yield db
    db.close()

并使用这个:

with db_connection() as db:
    db.some_db_method()

(也许这更接近您的 ruby​​ 等价物。另外,请参阅此处了解更多详细信息:http: //preshing.com/20110920/the-python-with-statement-by-example

希望这可以帮助

于 2013-05-02T05:10:06.720 回答