2024-06-08 11:47:05 发布
网友
我刚开始学习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
关键字as用于将子句添加到几个不同的语句(例如,^{});没有“as语句”。在
as
在with语句中,这意味着with上下文的值被分配给该变量。精确的解释在The ^{} statement,With Statement Context Managers,和{a4};PEP 343下的文档给出了一个更具可读性的解释(尽管它也有点过时)。在
with
在简单的情况下,当一个对象充当它自己的上下文管理器(如文件)或decimal.localcontext时,对象被分配给变量。这里,f是open('spam')返回的文件:
decimal.localcontext
f
open('spam')
with open('spam') as f:
在稍微复杂的情况下,上下文管理器提供一些分配给变量的其他对象。在closing(foo)的情况下,对象是它首先给定的foo。所以在这里,g和{}是一样的,即使closing(f)不是同一件事:
closing(foo)
foo
g
closing(f)
有些上下文管理器根本不提供任何对象。在这种情况下,as f将把f分配给None,而你通常没有任何好的理由使用它。因此,as子句是可选的。例如,使用threading.Lock:
as f
None
threading.Lock
with my_lock:
如果您从头开始构建上下文管理器,那么提供绑定到as目标的对象(无论是self)的方法是从__enter__方法返回它。或者,如果您在生成器周围使用@contextmanager修饰符来构建它们,那么可以通过yield来实现。在
self
__enter__
@contextmanager
yield
关键字} );没有“
as
用于将子句添加到几个不同的语句(例如,^{as
语句”。在在} statement ,With Statement Context Managers,和{a4};PEP 343下的文档给出了一个更具可读性的解释(尽管它也有点过时)。在
with
语句中,这意味着with
上下文的值被分配给该变量。精确的解释在The ^{在简单的情况下,当一个对象充当它自己的上下文管理器(如文件)或
decimal.localcontext
时,对象被分配给变量。这里,f
是open('spam')
返回的文件:在稍微复杂的情况下,上下文管理器提供一些分配给变量的其他对象。在}是一样的,即使
^{pr2}$closing(foo)
的情况下,对象是它首先给定的foo
。所以在这里,g
和{closing(f)
不是同一件事:有些上下文管理器根本不提供任何对象。在这种情况下,
as f
将把f
分配给None
,而你通常没有任何好的理由使用它。因此,as
子句是可选的。例如,使用threading.Lock
:如果您从头开始构建上下文管理器,那么提供绑定到
as
目标的对象(无论是self
)的方法是从__enter__
方法返回它。或者,如果您在生成器周围使用@contextmanager
修饰符来构建它们,那么可以通过yield
来实现。在相关问题 更多 >
编程相关推荐