通过名称从上下文获取值

2024-09-30 06:14:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将上下文变量用于类似的目的,如下面的问题和接受的答案: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,但正如您所见,我必须搜索所有变量,因为上下文变量不支持按名称查找。实现了按变量查找,但是如果我有变量,就可以直接从中获取值(f3acase)

恐怕我不明白为什么它是这样设计的。为什么一个约定的名字不是关键?如果在某种框架中设置一个上下文,然后由应用程序代码使用,那么这两个函数将位于不同的模块中,而没有一个通用的模块全局变量。有人能解释一下上下文变量API背后的原理吗?你知道吗


Tags: 模块key函数intestidvardef
1条回答
网友
1楼 · 发布于 2024-09-30 06:14:15

这样就可以得到keyuser\id的值

user_id = contextvars.ContextVar("user_id_var")
ctx = contextvars.copy_context()
ctx[user_id]
# or
ctx.get(user_id)

我在official document中看到,他们提到了一些可能与您的担忧有关的事情:

The notion of "current value" deserves special consideration: different asynchronous tasks that exist and execute concurrently may have different values for the same key

Making Context objects picklable

相关问题 更多 >

    热门问题