Python 3.10中使用contextvar出现AttributeError: __enter__问题求助
解决contextvars中AttributeError: __enter__的问题
你遇到的错误是因为contextvars.ContextVar.set()方法返回的是Token对象,不是上下文管理器,没有__enter__和__exit__方法,所以不能直接放在with语句里使用。
下面是两种正确的写法:
方法一:手动管理Token重置
import contextvars # 创建上下文变量 user_context = contextvars.ContextVar("user") # 设置变量并保存返回的token token = user_context.set("utilisateur123") try: # 块内访问变量 print(user_context.get()) # 输出"utilisateur123" finally: # 恢复到之前的上下文状态 user_context.reset(token) # 块外恢复默认值 print(user_context.get()) # 输出None
方法二:封装自定义上下文管理器
如果想继续用with语法,可以用contextlib.contextmanager封装一个上下文管理器:
import contextvars from contextlib import contextmanager user_context = contextvars.ContextVar("user") @contextmanager def set_user_context(value): token = user_context.set(value) try: yield finally: user_context.reset(token) # 使用自定义上下文管理器 with set_user_context("utilisateur123"): print(user_context.get()) # 输出"utilisateur123" print(user_context.get()) # 输出None
简单来说,ContextVar.set()的设计是通过返回的Token来手动控制上下文的重置,而非直接支持with语句,所以需要用上面两种方式来实现你想要的“块内生效、块外恢复”的效果。
内容的提问来源于stack exchange,提问作者Herve Meftah
相关产品推荐
相关产品推荐

