对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。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
禁用Eclipse Java调试器的热代码替换   每次运行jUnit测试时,JavaIntelliJIDEA都会重建整个模块   java如何从InputStream对象读取特定数据?   java我想在每次从recyclerview中单击一个项目时将对象添加到领域数据库   安卓在C和系统中退出(0)的实践。在Java中退出(0)   azure如何将文本文件附加到java中现有的zip文件?   java Spring安全性工作在tomcat服务器(Eclipse)上,但当我将war文件放入tomcat webapp时,Spring安全性就不工作了   java为什么在提供lambda参数时必须捕获异常?   java公共类扩展了JPanel   java如何在SpringAspectJ中使用“declare”指令?   java是编写大量文件的最佳方式   java创建具有多个类依赖项的jar文件   面向对象方法在Java中模拟类分类   java未找到类型为com的返回值的转换器。春天mvc。模型用户]   vb。net在java中解压缩visual basic中压缩的字符串   java为什么我可以更改类中的private属性?   更新Android Studio后java Gradle不工作   图像Java帮助。不规则间隔的幻灯片放映