Python 在asyncio add_done_回调中访问contextvars

Python 在asyncio add_done_回调中访问contextvars,python,python-asyncio,asynccallback,python-contextvars,Python,Python Asyncio,Asynccallback,Python Contextvars,在Python异步函数中,我正在创建ContextVar、task并向其附加回调: bbb = contextvars.ContextVar('aaa') bbb.set(3) task = self.loop.create_task(self.someFunc()) task.add_done_callback(self.commonCallback) bbb.set(4) 在回调中,我首先启动调试器: def commonCallback(self, result): pdb.set_t

在Python异步函数中,我正在创建ContextVar、task并向其附加回调:

bbb = contextvars.ContextVar('aaa')
bbb.set(3)
task = self.loop.create_task(self.someFunc())
task.add_done_callback(self.commonCallback)
bbb.set(4)
在回调中,我首先启动调试器:

def commonCallback(self, result):
 pdb.set_trace()
 try:
  r = result.result()
  print(r)
 except:
  self.log.exception('commonCallback')
-> try:
(Pdb) bbb.get()
*** NameError: name 'bbb' is not defined
(Pdb) ctx = contextvars.copy_context()
(Pdb) print(list(ctx.items()))
[(<ContextVar name='aaa' at 0xa8245df0>, 3)]
(Pdb) 
在调试器中:

def commonCallback(self, result):
 pdb.set_trace()
 try:
  r = result.result()
  print(r)
 except:
  self.log.exception('commonCallback')
-> try:
(Pdb) bbb.get()
*** NameError: name 'bbb' is not defined
(Pdb) ctx = contextvars.copy_context()
(Pdb) print(list(ctx.items()))
[(<ContextVar name='aaa' at 0xa8245df0>, 3)]
(Pdb) 
->试试看:
(Pdb)bbb.get()
***NameError:未定义名称“bbb”
(Pdb)ctx=contextvars.copy_context()
(Pdb)打印(列表(ctx.items())
[(, 3)]
(Pdb)

ContextVar在那里,但我无法访问它。因此,我遗漏了一些东西,但找不到什么?

局部变量在一个地方定义,因此在另一个地方不会自动访问它,例如在代码中其他地方定义的
commonCallback
函数。声明“上下文变量应在顶层模块级别创建”,因此您应该首先尝试此操作。

您可以从上下文中获取值,而无需导入顶层模块。 contextvars.Context具有_iter __方法。您可以使用for循环来获取值:

def get_ctx_var_值(ctx,var_名称,默认值=无):
对于ctx中的var:
如果var.name==var\u name:
返回ctx[var]
返回默认值
ctx=contextvars.copy_context()
var\u value=get\u ctx\u var\u value(ctx,'aaa')

为什么希望在一个函数中定义的
bbb
局部变量可以在代码中其他地方定义的
commonCallback
函数中访问?声明“上下文变量应该在顶级模块级别创建”。@user4815162342谢谢,就是这样。我知道这很琐碎,就像往常一样。我就是看不见。可悲的是,我并没有足够的声誉来支持我的评论。没问题,我现在发布了一个类似的建议,作为你们可以接受的答案。