python - 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_seed
Modules/_randommodule.c 中的方法并直接在此处引发类型错误。为什么?
解决方案
异常不是来自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>
推荐阅读
- python - xarray weighted().mean() 使用哪种精度?
- python - 在使用 Django 的模型上使用原始查询时,如何返回附加数据?
- jquery - 对于某些用户,POST 和 GET 同时从 Ajax POST JS 提交(双重请求)
- javascript - 与使用分号的区域中的某人共享包含用逗号分隔的公式的工作表
- r - 为随机生成的程序集赋值
- python - 如何检查一个日期时间对象是否在日期时间对象列表中?
- php - 如何使用 php 将文件上传到挂载的 S3 存储桶
- python - python pre-commit 工具是否可以将子目录视为项目的基础?
- java - 如何在while循环中将所有双打加在一起,java
- php - 解析 javascript 源代码文本并填充两个数组