我刚刚开始学习Flask框架,并想知道'as'语句的作用是什么?它与'with'语句一起使用。
以下是示例:
def init_db():
with closing (connect_db()) as db:
with app.open_resource('schema.sql', mode='r') as f:
db.cursor().executescript(f.read())
db.commit
答案 0 :(得分:7)
as
关键字用于向几个不同的语句添加子句(例如import
);没有“as
声明”。
在with
语句中,这意味着with
上下文的值被赋给该变量。准确的解释位于The with
statement,With Statement Context Managers和Context Manager Types下的文档中; PEP 343给出了一个更易读的解释(尽管它也有点过时)。
在简单的情况下,对象充当自己的上下文管理器,就像文件一样,或decimal.localcontext
,对象被分配给变量。此处f
是open('spam')
返回的文件:
with open('spam') as f:
在稍微复杂的情况下,上下文管理器提供了一些分配给变量的其他对象。在closing(foo)
的情况下,对象是首先给出的foo
。在这里,g
最终与f
完全相同,即使closing(f)
不同样的事情:
f = open('spam')
with closing(f) as g:
某些上下文管理器根本不提供任何对象。在这种情况下,正如您所期望的那样,as f
会将f
分配给None
,而您通常没有充分理由使用它。因此,as
子句是可选的。例如,使用threading.Lock
:
with my_lock:
如果您是从头开始构建上下文管理器,那么提供对象(无论self
或其他方式)绑定到as
目标的方式是从__enter__
返回它方法。或者,如果您使用生成器周围的@contextmanager
装饰器构建它们,则可以通过yield
对象进行构建。