Python中的一种块

时间:2013-05-02 05:05:28

标签: python ruby python-2.7

在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的匿名块?

1 个答案:

答案 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

希望这有帮助