You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:01:01