DEBUG.WIKI
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
搬瓦工;先看线路,再选 VPS;CN2 GIA · 对应线路套餐;查看线路 →
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS

Hypothesis randoms 对象的 seed(a=1) 报 TypeError

Hypothesis 6.169.3 已兼容 seed 的 a= 与 version= 参数,但生成的 Random 仍要求显式种子。升级时核对 Python 版本,并保留随机样本重放与缩减语义。

测试把 st.randoms() 生成的对象传进业务函数,业务函数按标准 random.Random 接口调用 seed(a=1),却报 ArtificialRandom.seed() got an unexpected keyword argument 'a'。另一些调用会在 version=2 或省略参数时停止。

这组错误要拆开处理:旧版 Hypothesis 的方法签名只接收一个位置参数;即使签名已经修正,生成对象仍不支持不带明确种子的重新播种。

6.169.3 修正了参数形式

Hypothesis 6.169.3 已让 randoms() 对象接受 a=、version= 等标准参数形式。当前正式 6.170.9 的实现也保留了这组签名。更新前同时核对 Python 版本:6.169 系列已经不再支持 Python 3.10,不能只在锁文件里抬高 Hypothesis 而忽略解释器约束。

下面是显式种子调用的结构示例,适用于已经采用修正版本的环境:

from hypothesis import given, strategies as st

@given(rng=st.randoms())
def test_seeded_choice(rng):
    rng.seed(a=17, version=2)
    first = rng.randrange(100)
    rng.seed(a=17, version=2)
    assert rng.randrange(100) == first

示例核对同一生成对象在相同显式种子下的重放,不要求结果等于标准库 Random(17) 的某个固定数字。默认 use_true_random=False 时,随机方法产生的值由 Hypothesis 生成并参与缩减,它不是标准伪随机算法输出序列的替身。

旧环境暂时不能更新时,rng.seed(17) 可以避开这一个关键字签名问题,但不能由此声称已经获得新版本的全部兼容行为。业务确实需要标准库的真实分布时,应另外评估 use_true_random=True;改变这个选项会改变测试数据生成方式,不能仅为消除异常就切换。

无参数 seed 仍然不适合生成对象

标准库 Random.seed() 允许省略种子,但 Hypothesis 生成的两种 Random 实现都要求明确种子。6.170.9 中调用 rng.seed() 或 rng.seed(None) 会得到更清楚的 InvalidArgument,提示 without an explicit seed。这不是升级没有生效。

如果被测函数每次自行调用无参数 seed(),先确定它是否真的需要在函数内部重置状态。可把播种责任留给调用方,并注入已经准备好的随机对象;必须由业务重播种时,显式种子也应成为可控制的输入。不要把当前时间换成种子来掩盖异常,否则失败样本难以重放。

验收应分别覆盖位置种子、a=、version=、重复播种以及无参数分支。保留原失败样本和测试依赖版本,确认异常发生在接口适配还是业务断言;测试通过不能靠跳过随机分支或把所有生成值固定成一个常量。