python - 运行 python3 -bb 时,为什么 set([b'foo', u'foo']) 失败但 set([b'foo', u'bar']) 成功?

标签 python python-3.x set

我试图通过添加 -bb 参数来使一些代码 str(bytes) 在 Python 3 上安全,这会将 str(bytes) 和 bytes/str 比较出错。

issue warnings about str(bytes_instance), str(bytearray_instance) and comparing bytes/bytearray with str. (-bb: issue errors)

程序失败,因为一个库试图构建一个包含 strbytes 的集合,但它无法交互地重现:set([b 'foo', u'bar']) 有效。为什么只有 set([b'foo', u'foo']) 失败?

最佳答案

通过实验:

  • set(['foo', b'foo']) 返回包含两个对象的集合
  • 'foo'b'foo' 哈希为相等的值
  • 因此 Python 必须比较它们是否相等(否则该集合将只有一个成员),因此在 -bb 下会引发错误
>>> set(['foo', b'foo'])
{b'foo', 'foo'}
>>> hash('foo')
7554140378331821102
>>> hash(b'foo')
7554140378331821102
>>> hash('foo') == hash(b'foo')
True
>>> 'foo' == b'foo'
False

关于python - 运行 python3 -bb 时,为什么 set([b'foo', u'foo']) 失败但 set([b'foo', u'bar']) 成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56632571/

相关文章:

python - pytorch数据加载器: `Tensors must have same number of dimensions`

python - 嵌套/转义 f 字符串 "="(等号)表达式

python - 从生成器创建一个 Pandas 数据框?

python - 使用过滤器和关联列表过滤图像列表

python - 如何遍历目录中的文件?

Python:一个列表中的子集元素基于另一个列表中的子字符串,每个子字符串仅保留一个元素

python - 将元组集合压缩到集合中 - python

.net - 如果我有一个返回不同列表的方法,我应该让它返回 ISet<T> 而不是 IEnumerable<T>

c++ - std::multiset 为插入和比较定义比较器

Python 多列表理解不起作用,如何正确地做到这一点?