开发者生态
morning
Show HN: Gawain – 需要所有 Python 变量的类型提示
摘要
gawain requires type annotations on the variables, parameters, returns and class attributes of Python code, then runs a type checker, ty or pyrefly , to check that the types are correct. Type checkers...
type
the
shop
gawain
and
has
annotation
class
checker
for
2026-11-15
1 阅读
约9分钟阅读
MarinhoD
字号:
kawain 需要对 Python 代码的变量、参数、返回值和类属性进行类型注释,然后运行类型检查器 ty 或 Pyrefly 来检查类型是否正确。 mypy、Pyright、ty 和 Pyrefly 等类型检查器会推断没有注释的变量的类型。 ruff 的 ANN 规则和 flake8 注释仅要求对函数进行注释。 gawin 还要求提供有关变量和类属性的信息。我构建 kawain 只是因为我讨厌 dict[str, Any] 并且想对此做点什么。如果你对此问题的回答是“但 Python 已经推断出这一点”或“但我的 IDE 为我推断了这一点”,那么就不要使用它,小学徒。给定 shop.py : PORT = 8080 重试 = 3 总计 =compute() def send ( to , body ): print ( f"to { to } : { body } " ) class Order : def __init__ ( self , items : list [ str ]) -> None : self 。 items = items kawain check shop.py 打印: [存在] shop.py:1:1 GW001 变量 'PORT' 没有类型注释 shop.py:3:1 GW001 变量 'total' 没有类型注释 shop.py:6:5 GW003 函数 'send' 没有返回类型注释 shop.py:6:10 GW002 函数 'send' 的参数 'to' 没有类型注释shop.py:6:14 GW002 函数“send”的参数“body”没有类型注释 shop.py:12:14 GW004 属性“items”未在类“Order”的主体中声明 6 个错误(存在)。在修复存在错误之前,会跳过类型检查。 retries = 3 次,因为文字具有明显的类型。 PORT 是一个常量,因此需要 Final[int] 。当每个注释都就位时,高文对同一文件运行类型检查器并打印其报告的内容。对于 ty,默认情况下,对于prices.py:def Total (prices:list[int]) -> int:return "0"[types] rates.py:2:12 ty[invalid-return-type]返回类型与返回值不匹配:预期`int`,发现`Literal["0"]`1个错误(类型)。安装 kawain 以及您想要的额外类型检查器。 ty 是默认检查器,ty extra 将其固定为 0.0.100: uv tool install " kawain[ty] " # 或 pip install " kawain[ty] " 要使用pyrefly,请安装 Pyrefly extra,它固定 Pyrefly 1.4.1 并且不安装 ty: uv tool install " kawain[pyrefly] " # 或 pip install " kawain[pyrefly] " 然后用检查器选择它= [tool.gain] 中的“pyrefly”,或使用 --checkerpyrefly 。 docs/configuration.md 解释了该开关。 pip install kawain 无需额外安装,仅安装 kawain 命令。然后它需要 PATH 上的检查器,或 --no-types 来仅运行注释检查。警告 小心使用 kawain。 ty 处于测试阶段,其诊断可能会因版本而异。如果这对您的项目来说是一个问题,请使用pyrefly或--no-types仅运行注释检查。 kawain check src/ # 注释,然后输入 kawain check src/ --no-types # 仅注释 kawain check src/ --checkerpyrefly #pyrefly 而不是 ty gamin check src/ --mode strict # 每个赋值都带有注释 kawain check src/ --format json # 一个 JSON 对象,用于工具 kawain 在没有报告任何内容时以 0 退出,在报告错误时以 1 退出,在使用错误时以 2 退出或者当类型检查器无法运行时。类型检查器的警告会被打印出来,但检查不会失败。代码报告 GW001 未分配注释的变量。 GW002 没有注释的参数。 GW003 没有返回注释的函数。 GW004 没有注释的类属性,或者类体未声明的 self.x。 GW010 未注释的常量 Final[T] 。 GW011 裸露的 Final ,没有类型。 GW020 注释中的任何内容。 GW000 标记文件无法读取,GW900 和 GW901 标记损坏或未使用的抑制。要使某一行静音,请命名代码: value = load () # kawain:ignore[GW001] docs/rules.md 具有完整的规则、豁免和抑制语法。默认模式是显而易见的。当名称的值具有明显的类型并且不再分配名称时,名称可以不带注释:文字 ( count = 0 )、文字容器 ( ids = [1, 2, 3] ) 或构造函数调用 ( user = User("ada") )。 strict 要求对每个作业进行注释:[ tool . kawain] mode = " strict " docs/rules.md 有每种模式的确切规则。 repos : - repo : https://github.com/matheuzgomes/kawain rev : v0.3.0 hooks : - id : kawain 预提交从该存储库的源安装钩子,因此构建它需要 Rust 1.97 或更高版本。 docs/configuration.md 详细介绍了 [tool.gain] 、路径和钩子。在 CPython 3.14 标准库(1,847 个文件,974,586 行)上,中位数为 30 次运行(flake8-annotations 为 5 次): 工具检查 中位数 kawain、明显模式变量、参数、返回、属性 0.46 s kawain、严格模式变量、参数、返回、属性 0.36 s ruff --select ANN 参数,返回 0.35 s flake8-annotations参数,返回 11.4 s gawin 用 --no-types 运行。这是一台机器(AMD Ryzen 7 3700X、WSL2)上的一项基准测试。 docs/benchmarks.md 包含再次运行它的版本和命令。 kawain 使用 ruff_python_parser 读取 Python 并使用 t 检查类型
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱