在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的匿名块?
答案 0 :(得分: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。您可以使用__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)
希望这有帮助