首页 > 解决方案 > Python如何将字节转换为浮点数?

问题描述

我有以下代码片段:

#!/usr/bin/env python3

print(float(b'5'))

哪个打印5.0没有错误(在使用 utf-8 编码的 Linux 上)。我很惊讶它没有给出错误,因为 Python 不应该知道字节对象使用什么编码。

有什么见解吗?

标签: pythonpython-3.xcharacter-encoding

解决方案


传递bytes对象时,float()将对象的内容视为 ASCII 字节。在这里就足够了,因为从字符串到浮点数的转换只接受 ASCII 数字和字母,以及.无论如何_(唯一允许的非 ASCII 代码点是空白代码点),这类似于int()处理bytes输入的方式。

在引擎盖下,实现是这样的:

  • 因为输入不是字符串,PyNumber_Float()所以在对象上调用(对于str代码直接跳转到的对象PyFloat_FromString)。
  • PyNumber_Float()检查__float__方法,但如果不可用,它会调用PyFloat_FromString()
  • PyFloat_FromString()不仅接受str对象,还接受任何实现缓冲区协议的对象。该String名称是 Python 2 的保留,在 C 实现str中调用了 Python 3 类型。Unicode
  • bytes对象实现缓冲区协议,PyBytes_AS_STRING用于访问保存字节的内部 C 缓冲区。
  • 两个名为的内部函数的组合,_Py_string_to_number_with_underscores()然后float_from_string_inner()用于将 ASCII 字节解析为浮点值。

对于实际str的字符串,CPython 实现实际上将任何非 ASCII 字符串转换为 ASCII 字节序列,方法是仅查看输入值中的 ASCII 代码点,并将任何非 ASCII 空白字符转换为 ascii 0x20 空格,然后使用相同的_Py_string_to_number_with_underscores()/float_from_string_inner()组合。

我认为这是文档中的一个错误,并已向 Python 项目提交了问题以对其进行更新。


推荐阅读