python - Python如何将字节转换为浮点数?
问题描述
我有以下代码片段:
#!/usr/bin/env python3
print(float(b'5'))
哪个打印5.0
没有错误(在使用 utf-8 编码的 Linux 上)。我很惊讶它没有给出错误,因为 Python 不应该知道字节对象使用什么编码。
有什么见解吗?
解决方案
传递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 项目提交了问题以对其进行更新。
推荐阅读
- arrays - 如何使用“reads”子句读取 Dafny 中的序列数组?
- ios - 在 SwiftUI 列表中呈现来自 Realm 的数据的正确方法是什么
- python - 尝试向 selenium 添加扩展时,我得到“参数‘self’未填充。”
- python - 如何为在 pygame 中创建的这个游戏的攻击设置动画?
- python - 定期打勾标签
- connection - IBM Integration Bus SOAP 服务调用错误
- html - 引导程序 | 同一div内的内联元素
- php - PHP如何使用公式数学模数将数组更改为字符串?
- android-studio - 如何使用 https 地址而不是 http 在 web 上运行 Flutter 应用程序:
- ios - 即使在 collectionView.reloadData 之后继续在 collectionView 中选择一个单元格