首页 > 解决方案 > Python random.Random(bytearray) TypeError: unhashable type

问题描述

在 Python3 中,random.Random(seed) 允许使用 bytearray 播种。

class Random(_random.Random):
    ...
    def __init__(self, x=None):
        self.seed(x)
        ...

    def seed(self, a=None, version=2):
        ...
        if version == 2 and isinstance(a, (str, bytes, bytearray)):
            if isinstance(a, str):
                a = a.encode()
            a += _sha512(a).digest()
            a = int.from_bytes(a, 'big')
        ...

当你尝试

>>> random.Random().__init__(bytearray([1, 2, 3]))

或者

>>> r = random.Random()
>>> r.seed(bytearray([1, 2, 3]))

它会毫无例外地工作。

但是当你尝试这个时,结果是不一致的。

>>> random.Random(bytearray([1, 2, 3]))
TypeError: unhashable type: 'bytearray'

我编译并调试了 python 3.7.0 二进制文件,当尝试使用字节数组初始化 PRNG 时,它将调用random_seedModules/_randommodule.c 中的方法并直接在此处引发类型错误。为什么?

标签: python

解决方案


异常不是来自Random.__init__()方法,而是来自__new__()之前调用的方法__init__()

>>> random.Random.__new__(random.Random, bytearray([1,2,3]))
TypeError: unhashable type: 'bytearray'
>>> random.Random.__new__(random.Random, bytes([1,2,3]))
<random.Random at 0x1b0cd78>

推荐阅读