Python random.Random(bytearray) TypeError:

在 Python3 中,random.Random(seed) 允许使用字节数组进行播种。


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 中的方法并在此处直接引发类型错误。为什么?


慕桂英3389331
浏览 242回答 2
2回答

芜湖不芜

异常不是来自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>

精慕HU

BlackJack 的回答启发了我。我仔细阅读了该方法的C源代码_random.Random.__new__。在_random.Random.__new__(方法random_newC)中调用_random.Random.seed方法(random_seed使用相同的参数中C)。如果args在random_seed功能包含非int对象作为一个种子,它会尝试获得哈希值的对象。因此,当对象是字节数组时,它会引发类型错误。因此,_random.Random并没有专门处理 bytearray 的播种,但它的子类random.Random做了,这似乎是一个不兼容的 python 错误。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python