类型安全 — E0010–E0029

捕获类型不匹配、错误注解和不健全类型使用的规则。完整代码列表请参见规则总览

缺失注解 | 所有规则


BSK-E0010 — 无法解析的导入 (Unresolved import)

import 语句引用了在已配置的搜索路径中无法找到的模块。

# 错误——找不到该模块
from legacy_module import process_data

# 修复——安装对应包或将其加入工作区,
# 也可通过 stub-paths 指向对应的 .pyi 文件

BSK-E0011 — 显式 Any 注解 / 返回类型不匹配 (Explicit Any / return type mismatch)

此代码覆盖两种检查:显式 Any 注解会屏蔽类型检查,必须附带理由;返回值与声明的返回类型明显不兼容也会触发此报告。

from typing import Any

# 警告——显式 `Any` 必须注明原因
def handle(
    data: Any,  # basilisk: ignore[BSK-E0011] -- awaiting stubs for third-party SDK
) -> bool:
    ...

# 错误——int 字面量不能赋值给 `str`
def name() -> str:
    return 42

BSK-E0012 — 参数类型不匹配

用错误类型的参数调用函数。

def greet(name: str) -> str:
    return f"Hello, {name}"

# 错误——int 不是 str
greet(42)

BSK-E0013 — 返回类型不匹配

返回值的类型与声明的返回类型不匹配。

def get_count() -> int:
    return "many"  # 错误——str 不是 int

BSK-E0014 — 赋值不兼容

将错误类型的值赋给注解变量。

count: int = 0
count = "zero"  # 错误——str 不是 int

BSK-E0015 — 无效的类型参数数量

泛型类型使用了错误数量的类型参数。

x: dict[str]        # 错误——dict 需要 2 个类型参数
y: dict[str, int]   # 正确

BSK-E0016 — 不兼容的方法覆盖

子类中的覆盖方法具有不兼容的签名。

class Base:
    def process(self, data: str) -> str: ...

class Child(Base):
    def process(self, data: int) -> str:  # 错误——参数类型已更改
        ...

BSK-E0017 — 不兼容的变量覆盖

类变量在子类中以不兼容的类型被覆盖。


BSK-E0018 — 未定义变量

使用了在当前范围中未定义的名称。


BSK-E0019 — 未绑定变量

在所有代码路径中赋值之前使用了变量。

def check(flag: bool) -> str:
    if flag:
        result = "yes"
    return result  # 错误——result 可能未绑定

BSK-E0020 — 缺少重载实现

@overload 组没有具体的实现函数。


BSK-E0021 — 重叠的重载

两个 @overload 签名从调用者的角度看无法区分。


BSK-E0022 — 哈希上下文中的不可哈希类型

可变类型(如 list)用作字典键或集合元素。

d: dict[list[int], str] = {}  # 错误——list 不可哈希

BSK-E0023 — 非穷举模式匹配

match 语句没有涵盖匹配类型的所有可能情况。

def classify(x: int | str) -> str:
    match x:
        case int():
            return "number"
    # 错误——未处理 str 情况

BSK-E0024 — 无效类型形式

在类型位置使用了非有效类型的值,例如将数字字面量用作注解。

x: 42 = 0   # 错误——`42` 不是类型
y: int = 0  # 正确

BSK-E0025 — 缺少 @override 装饰器

覆盖父类方法的方法缺少 @override 装饰器(PEP 698)。

class Child(Base):
    def process(self) -> str:  # 错误——缺少 @override
        ...

BSK-E0026 — TypeVar 只有一个约束

声明仅有一个约束的 TypeVar 没有意义——约束需要两个或更多。

from typing import TypeVar

T = TypeVar("T", int)        # 错误——只有一个约束
U = TypeVar("U", int, str)   # 正确——两个或更多

BSK-E0027 — Generic[...] 基类中重复的 TypeVar

同一 TypeVarGeneric[...](或 Protocol[...])基类中出现了不止一次。

from typing import Generic, TypeVar

T = TypeVar("T")
class Box(Generic[T, T]):  # 错误——`T` 出现两次
    ...

BSK-E0029 — 在 TypedDict 类中定义方法

TypedDict 类仅描述数据结构,不允许定义方法。

from typing import TypedDict

class Movie(TypedDict):
    title: str
    def play(self) -> None:  # 错误——TypedDict 中不允许定义方法
        ...