在O'Reilly第5章的视频教程"Learning Cython"中,有一个名为strings.ipynb
的笔记本。
第一个单元加载Cython扩展:
%load_ext cython
后面跟着这个Cython细胞:
%%cython
# cython: language_level=3
def f(char* text):
print(text)
然后使用以下单元格来演示(Unicode)字符串不能用作char*
参数:
f('It is I, Arthur, son of Uther Pendragon')
这里的结果是TypeError
异常。
以上都是我对作者在画外音中的评论所期望的。然而,下一个细胞的结果:
f(b'It is I, Arthur, son of Uther Pendragon')
这是:
b'It is I, Arthur, son of Uther Pendragon'
这把我难住了。
在函数f
中使用了普通的print
,为什么输出看起来好像首先通过repr
运行,而在上面的Cython代码中显然是而不是通过repr
运行?
作者甚至没有在画外音中提到这个(至少对我来说)有点意想不到的结果。
给了什么?为什么输出看起来像是首先通过repr
传递的?是否Python 3中的字节字符串不是"可打印的"(即没有str
方法),因此回落到repr
?
PS:我必须承认我是从Python 2开始的。并且没有太多接触Python 3。
因为它是。在Python 3中,bytes_str
在内部使用bytes_repr
:
static PyObject *
bytes_str(PyObject *op)
{
if (Py_BytesWarningFlag) {
if (PyErr_WarnEx(PyExc_BytesWarning,
"str() on a bytes instance", 1))
return NULL;
}
return bytes_repr(op); // call repr on it
}
因此,print
实质上会调用repr(bytes_instance)
。