Python如何将字节转换为float?

sta*_*tti 12 python character-encoding python-3.x

我有以下代码片段:

#!/usr/bin/env python3

print(float(b'5'))
Run Code Online (Sandbox Code Playgroud)

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

任何见解?

Mar*_*ers 11

传递bytes对象时,float()将对象的内容视为ASCII字节.这就足够了,因为从字符串到float的转换只接受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项目的问题以使其更新.

  • @static_rtti:绝对可以,因为 `\x00` 字节不会被接受。字节**必须**仅为 ASCII,并符合“float()”字符串解释规则。 (2认同)