You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Hypothesis状态测试中的Bundle正确添加类型提示?

解决Hypothesis中Bundle的类型注解问题

你在为Hypothesis状态测试代码添加类型提示时,遇到mypy报错提示keys和values这两个Bundle变量缺少类型注解。这是因为mypy无法自动推断Bundle容器内的元素类型,需要显式标注泛型类型参数。

解决方法

Bundle是Hypothesis提供的泛型类,格式为Bundle[T],其中T代表该Bundle存储的元素类型。你的代码中keys和values都对应bytes类型,只需为这两个变量添加泛型类型注解即可:

keys: Bundle[bytes] = Bundle("keys")
values: Bundle[bytes] = Bundle("values")

修改后的完整代码

import shutil
import tempfile
from collections import defaultdict

import hypothesis.strategies as st
from hypothesis.database import DirectoryBasedExampleDatabase
from hypothesis.stateful import Bundle, RuleBasedStateMachine, rule


class DatabaseComparison(RuleBasedStateMachine):
    def __init__(self) -> None:
        super().__init__()
        self.tempd = tempfile.mkdtemp()
        self.database = DirectoryBasedExampleDatabase(self.tempd)
        self.model: dict[bytes, set[bytes]] = defaultdict(set)

    keys: Bundle[bytes] = Bundle("keys")
    values: Bundle[bytes] = Bundle("values")

    @rule(target=keys, k=st.binary())
    def add_key(self, k: bytes) -> bytes:
        return k

    @rule(target=values, v=st.binary())
    def add_value(self, v: bytes) -> bytes:
        return v

    @rule(k=keys, v=values)
    def save(self, k: bytes, v: bytes) -> None:
        self.model[k].add(v)
        self.database.save(k, v)

    @rule(k=keys, v=values)
    def delete(self, k: bytes, v: bytes) -> None:
        self.model[k].discard(v)
        self.database.delete(k, v)

    @rule(k=keys)
    def values_agree(self, k: bytes) -> None:
        assert set(self.database.fetch(k)) == self.model[k]

    def teardown(self) -> None:
        shutil.rmtree(self.tempd)


TestDBComparison = DatabaseComparison.TestCase

验证结果

修改后重新运行mypy,之前的var-annotated错误会消失,代码可以通过类型检查。

内容的提问来源于stack exchange,提问作者Jerry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:53:29