contextvars
是 python 3.7 新加的内容,看到asyncio
模块用到,记录一下用法
名称解释
ContextVar
: 上下文环境变量Context
: 上下文对象Token
: 改变上下文变量产生的tokencopy_context
: 复制当前的上下文环境对象
常用函数及功能
copy_context
复制当前上下文环境,得到一个Content
类型的上下文环境对象。
from contextvars import copy_context, Context
ctx = copy_context()
assert isinstance(ctx, Context)
ContextVar
环境变量对象
from contextvars import ContextVar
var = ContextVar("var", default=123)
assert var.get() == 123
var.set(456)
assert var.get() == 456
Token
环境变量在修改之后的记录令牌, 记录修改前的值,可以用来恢复
from contextvars import ContextVar, Token
var = ContextVar("var", default=123)
var.set(456)
token = var.set(789)
# token 类型 为 Token
assert isinstance(token, Token)
assert var.get() == 789
# 恢复
var.reset(token)
assert var.get() == 456
# 属性
assert token.old_value == 456
assert token.var == var
run 函数
context.run(callback, *args, **kwargs)
在context上下文环境中运行callback函数,所有的上下文环境变量的修改都记录到context对象中
from contextvars import copy_context, ContextVar
var = ContextVar("var")
var.set("qwe")
def cb():
var.set("asd")
ctx = copy_context()
ctx.run(cb)
# 在此上下文中的修改记录到了本ctx上下文对象中
assert ctx.get(var) == "asd"
# 对当前的上下文对象没影响
assert var.get() == "var"
附上: Context 的方法
class Context(object):
# no doc
def copy(self, *args, **kwargs):
pass
def get(self, *args, **kwargs):
pass
def items(self, *args, **kwargs):
pass
def keys(self, *args, **kwargs):
pass
def run(self, *args, **kwargs):
pass
def values(self, *args, **kwargs):
pass