What does the 'with' statement do in python?
本问题已经有最佳答案,请猛点这里访问。
我是Python的新手。在一个关于连接到MySQL和获取数据的教程中,我看到了
1 2 3 4 | with open('/etc/passwd', 'r') as f: print f.readlines() print"file is now closed!" |
即使您有一个
为了使
根据我发现的一个教程,
此代码:
1 2 3 4 5 | conn = MySQLdb.connect(...) with conn: cur = conn.cursor() cur.do_this() cur.do_that() |
将作为单个事务提交或回滚命令序列。这意味着您不必太担心异常或其他异常代码路径——不管您如何离开代码块,事务都将得到处理。
从根本上讲,它是一个对象,它用在入口和出口调用的自定义逻辑来划分代码块,并且可以在其构造中接受参数。可以使用类定义自定义上下文管理器:
1 2 3 4 5 6 7 8 9 10 11 12 | class ContextManager(object): def __init__(self, args): pass def __enter__(self): # Entrance logic here, called before entry of with block pass def __exit__(self, exception_type, exception_val, trace): # Exit logic here, called at exit of with block return True |
然后入口被传递一个ContextManager类的实例,并且可以引用在
然后我们可以这样使用它:
1 2 | with ContextManager(myarg): # ... code here ... |
这对于管理资源生命周期、释放文件描述符、管理异常以及构建嵌入式DSL等更复杂的用途都很有用。
另一种(但等效的)构造方法是
1 2 3 4 5 6 7 | from contextlib import contextmanager @contextmanager def ContextManager(args): # Entrance logic here yield # Exit logic here |
把