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项目的问题以使其更新.
| 归档时间: |
|
| 查看次数: |
1703 次 |
| 最近记录: |