代码之家  ›  专栏  ›  技术社区  ›  static_rtti

python如何将字节转换成float?

  •  12
  • static_rtti  · 技术社区  · 6 年前

    我有以下代码段:

    #!/usr/bin/env python3
    
    print(float(b'5'))
    

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

    有什么见解吗?

    1 回复  |  直到 6 年前
        1
  •  11
  •   Martijn Pieters    6 年前

    当通过 bytes 对象, float() 将对象的内容视为ASCII字节。这就足够了,因为从字符串到浮点的转换只接受ASCII数字和字母,加上 . _ 无论如何(唯一允许使用的非ASCII码位是空白码位),这类似于 int() 对待 字节 输入。

    在引擎盖下,实现将执行以下操作:

    • 因为输入不是字符串, PyNumber_Float() 在对象上调用 str 对象代码直接跳转到 PyFloat_FromString )
    • pynumber_float()号 检查 __float__ 方法,但如果该方法不可用,它将调用 PyFloat_FromString()
    • pyfloat_fromstring()。 不仅接受 STR 对象,但任何对象 object implementing the buffer protocol . 这个 String 名称是一个python 2保留,python 3 STR 类型被调用 Unicode 在C实现中。
    • 字节 对象实现缓冲区协议,并且 PyBytes_AS_STRING macro 用于访问保存字节的内部C缓冲区。
    • 两个内部函数的组合 _Py_string_to_number_with_underscores() float_from_string_inner() 然后用于将ASCII字节解析为浮点值。

    实际 STR 字符串,cpython实现通过只查看输入值中的ASCII码位,并将任何非ASCII空格字符转换为ASCII 0x20空格,从而将任何非ASCII字符串转换为ASCII字节序列,然后使用相同的 _带下划线()的py_字符串\到\数字\u / 从内部浮动 联合体。

    我认为这是文档中的一个bug, filed issue with the Python project 更新它。