contextvar 默认值的工厂

Factory for contextvar default value

将字典设置为 ContextVar 默认值:

var: ContextVar[dict] = ContextVar('var', default={})

...有点管用,因为字典默认可用,但它总是引用相同的实例,而不是为每个上下文生成一个新实例。

contextvars 是否以某种方式支持工厂(对于字典、列表等),如:

var: ContextVar[dict] = ContextVar('var', default=list)
var: ContextVar[dict] = ContextVar('var', default=lambda: dict())

还是我必须手动完成:

var: ContextVar[Optional[dict]] = ContextVar('var', default=None)

...

if not var.get():
    var.set({})

显然 ContextVars 的设计选择是在提供低级、准系统、功能而非易用性的方向上。

没有简单的方法来获得上下文感知的命名空间,正如您打算通过将字典作为默认值来实现的那样。而且,默认值没有使用工厂而不是单个对象的选项。

克服这个问题的唯一方法是编写一个 class,在 contextvars(或其他上下文分离机制)之上提供更高级别的接口。

我正在开发这样一个包,虽然我还没有发布 - 主要目标是有一个 class 作为一个免费使用的命名空间,就像 threading.Local 实例。 (还有一个 class 使用映射界面)- 如果我有更多的人使用并提供一些反馈,我可以更快地完成表格:

https://github.com/jsbueno/extracontext