1

将字典设置为ContextVar默认值:

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

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

上下文变量是否以某种方式支持工厂(用于字典、列表等),如:

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({})
4

1 回答 1

1

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

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

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

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

https://github.com/jsbueno/extracontext

于 2021-04-16T12:53:12.163 回答