我想将上下文变量用于类似的目的,例如此问题和已接受的答案:Context variables in Python
在此示例中,它对应于f3a()
:
import contextvars
user_id = contextvars.ContextVar("user_id_var")
def test():
user_id.set("SOME-DATA")
f2()
def f2():
f3a()
f3b()
def f3a():
print(user_id.get())
def f3b():
ctx = contextvars.copy_context()
for key, value in ctx.items():
if key.name == 'user_id_var':
print(value)
break
test()
但是,该函数需要user_id
全局变量才能获取值。如果在其他模块中,则需要将其导入。
我的想法是,如果一个函数知道存在上下文并且知道变量名,那应该就是它所需要的。我写了f3b
,但是如您所见,我必须搜索所有变量,因为上下文变量不支持按名称查找。按变量查找已实现,但是如果有变量,则可以直接从中获取值(f3a
情况)
恐怕我不明白为什么要这样设计。为什么商定的名称不是密钥?如果上下文是在某种框架中设置的,然后由应用程序代码使用,则这两个功能将位于不同的模块中,而没有通用的模块全局变量。我能找到的例子对我没有帮助。有人可以解释一下上下文vars API背后的原理吗?
答案 0 :(得分:0)
您可以通过这种方式获取键 user_id 的值
user_id = contextvars.ContextVar("user_id_var")
ctx = contextvars.copy_context()
ctx[user_id]
# or
ctx.get(user_id)
我在official document中看到他们提到了一些与您的担忧有关的事情:
“当前值”的概念值得特别考虑:同一键同时存在并同时执行的不同异步任务可能具有不同的值