一种在Python中向contextvars添加类型的方法

时间:2018-12-17 15:14:30

标签: python mypy

在ContextVar上调用get方法时,是否可以输入结果?

类似这样的东西

from contextvars import ContextVar

my_var : ContextVar[MyType] = ContextVar('my_var', default=None)

因此,稍后我可以在调用get方法之后在我的IDE中输入提示(intellisense)

current_val = my_var.get() # Now the IDE knows the type because of the generic

是否存在类似的东西,还是我应该在python repo(或mypy repo?)中更好地创建问题?

1 个答案:

答案 0 :(得分:0)

我有一个 contextvars 的替代包——我在过去几周回来开发它——主要思想是拥有一个比“contetvars”get/set/copy_context/run 语义更友好的界面——第一个完全实现的类的工作方式类似于 threading.local,作为任意命名空间。

我还没有想到类型提示/猜测 - 但看到你的问题,它确实是这样工作的:

from extracontext import ContextLocal

class MyContext(ContextLocal):
    my_var: MyType
    other_var: OtherType


mycontext = MyContext()  # use this as the namespace:
mycontext.my_var = 20

mycontext._run(my_function) # the same as contextvars.Context.run -

# the instance can also be used in a context-manager block ("with" statement)
# or as a decorator to sync functions that need separate contexts.
# independent context values for new threads or async-tasks is automatic)

它会自然而然地工作。 唯一的一点是 extracontext 尚未发布 (2021-03-09),您必须从 git 安装:

pip install -U git+https://github.com/jsbueno/extracontext.git@0.2b2

这个版本有 asyncio-local 上下文类的纯 Python 实现,它将数据存储在运行框架闭包中,使用 f_locals 作为映射 - 我正在研究一个上下文变量支持的类,它将保留大致相同的语义。

https://github.com/jsbueno/extracontext