– 上下文变量 – Python标准库(Python教程)(参考资料)
contextvars– 上下文变量
此模块提供API来管理,存储和访问context-localstate。ContextVar类用于声明和使用Context Variables。copy_context()功能和Contextclass应该用于管理异步框架中的当前上下文.
有状态的文本管理器应该使用Context Variables而不是threading.local()在并发代码中使用时,防止他们的状态意外地从其他代码中出来.
也可以看看 PEP 567 了解更多详情.
版本3.7.
上下文变量
- class
contextvars.ContextVar(name [, *, default] ) -
这个类用于声明一个新的Context变量,例如:
var: ContextVar[int] = ContextVar("var", default=42)所需的name参数用于内省和调试目的.
可选关键字default当在当前上下文中找不到变量的值时,
ContextVar.get()返回参数.重要的上下文变量应该在顶层模块级别创建,永远不会在闭包中创建。
Context对象保存对上下文变量的强引用,这可以防止上下文变量被正确地垃圾收集.name-
变量的名称。这是一个只读属性.
新版本3.7.1.
get( [default])-
返回当前上下文的上下文变量的值.
如果当前上下文中的变量没有值,则方法将:
- 返回值default方法的参数,如果提供的话;或
- 返回上下文变量的默认值,如果它是用一个创建的;或
- 举起
LookupError.
set(value)-
调用在currentcontext中为上下文变量设置一个新值
required value参数是contextvariable的新值
返回
Token对象,可用于通过ContextVar.reset()将变量恢复为之前的值method
reset// (token)-
将上下文变量重置为
ContextVar.set()创建token之前的值。例如:
var = ContextVar("var")token = var.set("new value")# code that uses "var"; var.get() returns "new value".var.reset(token)# After the reset call the var has no value again, so# var.get() would raise a LookupError.
- class
contextvars.Token -
Token对象由
ContextVar.set()方法。他们可以传到ContextVar.reset()将变量的值恢复到相应的set.Token.var-
只读属性。指向
ContextVar创建令牌的对象.
Token.MISSING-
使用的标记对象
Token.old_value.
手动上下文管理
contextvars.copy_context()-
返回当前
Context宾语。以下代码段获取当前上下文的副本并打印所有变量及其中设置的值:
ctx: Context = copy_context()print(list(ctx.items()))
- class
contextvars.Context -
的映射
ContextVars他们的价值观Context()创建一个没有值的空上下文。要获取当前上下文的副本,请使用copy_context()function.Context实现
collections.abc.Mappinginterfacerun// (callable, *args, **kwargs)-
执行
callable(*args, **kwargs)在上下文对象中的代码调用run方法。如果发生了一个异常,则返回执行程序的结果传播异常.任何更改callable使上下文对象中包含的任何上下文变量:
var = ContextVar("var")var.set("spam")def main(): # "var" was set to "spam" before # calling "copy_context()" and "ctx.run(main)", so: # var.get() == ctx[var] == "spam" var.set("ham") # Now, after setting "var" to "ham": # var.get() == ctx[var] == "ham"ctx = copy_context()# Any changes that the "main" function makes to "var"# will be contained in "ctx".ctx.run(main)# The "main()" function was run in the "ctx" context,# so changes to "var" are contained in it:# ctx[var] == "ham"# However, outside of "ctx", "var" is still set to "spam":# var.get() == "spam"
context[var]-
//返回var
ContextVar变量的值。如果在上下文对象中没有设置变量,则KeyError被引发
iter(context)-
将一个迭代器返回到存储在contextobject中的变量.
len(proxy)-
返回上下文对象中设置的变量数.
keys()-
返回上下文对象中所有变量的列表.
values()-
返回上下文对象中所有变量值的列表.
items()-
返回包含上下文对象中所有变量及其值的2元组列表.
asynciosupport
本机支持上下文变量在asyncio并且无需任何额外配置即可使用。例如,这里是一个简单的echo服务器,它使用一个上下文变量来使一个远程客户端的地址在Task中处理该客户端:
import asyncioimport contextvarsclient_addr_var = contextvars.ContextVar("client_addr")def render_goodbye(): # The address of the currently handled client can be accessed # without passing it explicitly to this function. client_addr = client_addr_var.get() return f"Good bye, client @ {client_addr}\n".encode()async def handle_request(reader, writer): addr = writer.transport.get_extra_info("socket").getpeername() client_addr_var.set(addr) # In any code that we call is now possible to get # client"s address by calling "client_addr_var.get()". while True: line = await reader.readline() print(line) if not line.strip(): break writer.write(line) writer.write(render_goodbye()) writer.close()async def main(): srv = await asyncio.start_server( handle_request, "127.0.0.1", 8081) async with srv: await srv.serve_forever()asyncio.run(main())# To test it you can use telnet:# telnet 127.0.0.1 8081
评论被关闭。