如何为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
相关产品推荐
相关产品推荐

