无法理解 Jupyter 笔记本中的输出 ( "Learning Cython" )



在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)

相关内容

  • 没有找到相关文章

最新更新