对trio及相关项目的静态类型检查支持
trio-typing的Python项目详细描述
Trio类型:Trio和相关项目的静态类型
此存储库提供:
- PEP 561为三个项目包键入存根包:
-
一个包,其中包含三个程序通常需要的类型
参考(
托儿所, 异步生成器[y,s] , 任务状态[t] )和mypy 在基本类型提示中消除某些限制的插件。
支持的平台
要使用三输入法输入检查代码,您需要cpython 3.5.2 或稍后。(mypy需要3.5.2+,并且它的依赖性 键入ast 不支持pypy。)我们使用最新版本在linux上测试 从3.5、3.6和3.7分支,以及每晚3.8-dev。我们是 不故意做任何操作系统特定的事情,所以其他操作系统应该可以工作 同样,
您可以在任何平台上运行使用三输入法的代码 由Trio支持,包括Pypy和CPython 3.5.0和3.5.1。
不支持mypy以外的类型检查程序,但可能有效。 欢迎使用体验报告和修补程序添加支持。
快速启动
安装时使用:
pip install -U trio-typing
在 mypy.ini中启用插件(可选,但推荐):
[mypy] plugins = trio_typing.plugin
开始用你的三重奏代码运行mypy!您可能需要导入一些类型 三人组输入的姓名,如托儿所和taskstatus,见下文 有关详细信息。
盒子里有什么?
stubs包为 自发布之日起,Trio , 结果 ,以及异步发生器。 在相应的 三重输入分布中。你不需要 显式地配置这些;只需说import trio(例如) mypy将知道查看三个stub中的类型信息。
trio-u打字包提供:
- 三人组匿名的两种重要类型的名称: 托儿所 以及taskstatus[t] (其中 t 是值的类型 任务提供返回from 托儿所.start() )。这些是 实现为abcs,而trio中的实际私有类型 (比如trio.core.run.nursery)注册为虚拟子类 他们当中。因此,您不能实例化trio类型,但是 isinstance(nursery,trio_typing.nursery) 其中 nursery 是三个 托儿所对象确实返回true。
- typing.asyncGenerator[yieldt,sendt]到python 3.5的后台端口。 ( yieldt 是生成器生成的值的类型,并且 sendt 是它作为 asend() 的参数接受的值类型。 这是描述异步生成器接口的抽象类: 异步迭代器 反省属性。在3.6+, Trio_Typing.AsyncGenerator上 只是对typing.asyncGenerator的重新导出。
-
兼容异步生成器[yieldt,sendt,returnt]
,
其他匿名具体异步生成器类型的名称
由异步生成器函数返回。它是
异步生成器[yieldt,sendt]
并提供相同的方法。
(本机异步生成器没有
returnt ;它只与 在确定await async_generator.yield_from_() 的返回类型时 -
一些只对mypy插件有用的类型:
yieldtype[t], sendtype[t],decorator @接受可调用的参数和参数。
mypy插件提供:
用修饰的函数的参数类型检查 @asyncContextManager (异步生成器中的一个 在3.7+ contextlib和异步发生器中各有一个
推断更具体的trio.open_file() 和trio.path.open() 基于常量 模式和缓冲参数的返回类型,因此 等待trio.open_文件("foo","rb",0) 返回无缓冲异步 文件对象处于二进制模式,并等待trio.open_file("bar") 返回 文本模式下的异步文件对象
在没有参数的情况下检查 task_status.started() 的签名, 因此,如果 task_status 对象不是类型 任务状态[无]
采用参数 (fn,*args) 的函数的样板简化 最终调用fn(*args):只需编写:
from mypy_extensions import VarArg @trio_typing.takes_callable_and_args def start_soon( async_fn: Callable[[VarArg()], Awaitable[T]], *args: Any, other_keywords: str = are_ok_too, ): # your implementation here
很快启动(异步,*args) 如果异步(args) 将引发错误 会的。你也可以让Callable接受一些非飞溅的 参数;在 您编写的参数列表 vararg()
当插件不存在时,上面的示例将始终失败 使用。如果您希望在这种情况下始终通过,可以使用联合:
@trio_typing.takes_callable_and_args def start_soon( async_fn: Union[ Callable[..., Awaitable[T]], Callable[[VarArg()], Awaitable[T]], ], *args: Any, other_keywords: str = are_ok_too, ): # your implementation here
如果没有这个插件,这个类型检查得很好(并且允许推断
t),因为任何可调用的都将匹配 可调用的[…, 可等待的[T] 选项。有了这个插件,整个联盟将 替换为特定的参数类型。 注意:由于mypy的限制,我们最多只支持5个 位置参数和关键字参数不能这样传递; 托儿所。立即开始(functools.partial(…)) 将通过类型检查器 但无法实际检查参数类型。
基本上完全支持类型检查 @async_generator 函数。 您编写修饰函数时,就好像它返回了其实际 返回类型,其屈服类型包装在 yield type[] 中,其发送 键入wrapped in sendtype[] :
from trio_typing import YieldType, SendType @async_generator async def sleep_and_sqrt() -> Union[None, SendType[int], YieldType[float]]: next_yield = 0.0 while True: amount = await yield_(next_yield) # amount is an int if amount < 0: return None await trio.sleep(amount) next_yield = math.sqrt(amount) # prints: CompatAsyncGenerator[float, int, None] reveal_type(sleep_and_sqrt())
从异步生成器内部调用 yield和 yield 函数根据这些声明进行类型检查。如果你离开 off 无论是屈服类型还是发送类型,都假定缺少一个 如果两个都不写(只写
异步定义睡眠和sqrt() ->; 无: ,如果没有 使用这个插件),它们都被认为是 任意的注意显式
return none ;mypy不接受 return 或 从函数的结尾掉下来,除非你用 --无警告不返回
限制
- 调用变量trio函数,如 trio.run() , nursery.start_so on() 等等,最多只能键入5个check 位置参数。(这个数字很容易增加,但是 只是以每个人的打字速度慢为代价;mypy的当前 架构要求我们最初为 我们希望能够使用的每一个arity。)您可以使用 a 键入:忽略注释。
outcome.capture() 和 outcome.acapture() 当前不进行类型检查 他们的论点。
运行测试
pytest -p trio_typing._tests.datadriven --pyargs trio_typing
许可证
您可以选择麻省理工学院或阿帕奇2.0。