文档章节

5. Python3源码—字符串(str)对象

Mr_zebra
 Mr_zebra
发布于 2018/10/17 12:49
字数 293
阅读 12
收藏 0

5.1. 字符串对象

字符串对象是“变长对象”。

5.1.1. Python中的创建

Python中字符串(strs)对象最重要的创建方法为PyUnicode_DecodeUTF8Stateful,如下Python语句最终会调用到PyUnicode_DecodeUTF8Stateful:

a = 'hello
b = str('world')

5.1.2. PyUnicode_DecodeUTF8Stateful的C调用栈

词法解析,最终调到PyUnicode_DecodeUTF8Stateful,调用顺序如下:

// ast.c
ast_for_expr
=>ast_for_power
=>ast_for_atom_expr
=>ast_for_atom (case STRING)
=>parsestrplus
=>parsestr

// unicodeobject.c
=> PyUnicode_DecodeUTF8Stateful

5.1.3. PyUnicode_DecodeUTF8Stateful源码

// unicodeobject.c
PyObject *
PyUnicode_DecodeUTF8Stateful(const char *s,
                             Py_ssize_t size,
                             const char *errors,
                             Py_ssize_t *consumed)
{
    _PyUnicodeWriter writer;
    const char *starts = s;
    const char *end = s + size;

    Py_ssize_t startinpos;
    Py_ssize_t endinpos;
    const char *errmsg = "";
    PyObject *error_handler_obj = NULL;
    PyObject *exc = NULL;
    _Py_error_handler error_handler = _Py_ERROR_UNKNOWN;

    if (size == 0) {
        if (consumed)
            *consumed = 0;
        _Py_RETURN_UNICODE_EMPTY();
    }

    /* ASCII is equivalent to the first 128 ordinals in Unicode. */
    if (size == 1 && (unsigned char)s[0] < 128) {
        if (consumed)
            *consumed = 1;
        return get_latin1_char((unsigned char)s[0]);
    }

    _PyUnicodeWriter_Init(&writer);
    writer.min_length = size;
    if (_PyUnicodeWriter_Prepare(&writer, writer.min_length, 127) == -1)
        goto onError;

    writer.pos = ascii_decode(s, end, writer.data);
    s += writer.pos;
    while (s < end) {
        // ascii解码后的size小于传入的size
    }

End:
    if (consumed)
        *consumed = s - starts;

    Py_XDECREF(error_handler_obj);
    Py_XDECREF(exc);
    return _PyUnicodeWriter_Finish(&writer);

onError:
    Py_XDECREF(error_handler_obj);
    Py_XDECREF(exc);
    _PyUnicodeWriter_Dealloc(&writer);
    return NULL;
}

可以看到:

本文转载自:http://click.aliyun.com/m/1000018751/

共有 人打赏支持
Mr_zebra
粉丝 25
博文 1098
码字总数 509
作品 0
私信 提问
5. Python3源码—字符串(str)对象

5.1. 字符串对象 字符串对象是“变长对象”。 5.1.1. Python中的创建 Python中字符串(strs)对象最重要的创建方法为PyUnicodeDecodeUTF8Stateful,如下Python语句最终会调用到PyUnicodeDeco...

传授知识的天使
2018/06/06
0
0
Python 对象的身份迷思:从全体公民到万物皆数

作者 | 豌豆花下猫 责编 | 胡巍巍 这篇文章里即将说出来的东西,也许你本以为知道了,或者你本以为很熟悉,但是,经过我的分析,我相信你会得到不一样的感悟,从此以后,你对Python的理解也会...

CSDN资讯
2018/11/14
0
0
python3.x与python2.x的区别汇总

python3.x与python2.7.x都是比较流行的版本,虽然建议现在的初学者开始学习python3.x的版本,但是还有很多的工程使用的是python2.7.x版本。观看代码的时候难免会出现一些问题。 在google上搜...

oldpan
2017/10/10
0
0
[Python源码学习]之PyObject和PyTypeObject

Python C api中的绝大多数函数其参数和返回值中包含 PyObject*。这指针类型指向一个可以表示任何Python对象的不透明的数据结构。所有的Python对象在多数情况下以相同的方式对待。 所有的Pyt...

晨曦之光
2012/05/08
165
0
Python之路——Python3 入门教程

本文适合有Java编程经验的程序员快速熟悉Python,本文程序在windows xp+python3.1a1测试通过。   本文提到的idle指python shell,即安装python后你在菜单看到的IDLE(python gui),在idle里c...

SANSOM
2013/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

layui弹窗滑动问题

问题:弹窗之后,父窗口总是滑动到顶部 思路:使用锚点的机制,实现关闭弹窗后滑动到锚点 ,end:function(){ ... if (location.hash== hash) { location.hash = ''; }...

关元
26分钟前
1
0
presto函数

CASE CASE expression WHEN value THEN result [ WHEN ... ] [ ELSE result ]ENDSELECT a, CASE a WHEN 1 THEN 'one' WHEN 2 THEN 't......

hutaishi
34分钟前
1
0
.git目录瘦身

瘦身过程如下: 1.复制两个最新版本 git clone ssh://git@host:port/project.git dir1/project dir2/project 2.对dir1目录的工程进行瘦身 删除所有非python文件以及其记录,并提交. git filte...

legend3
38分钟前
2
0
Debian pip3 ImportError: cannot import name 'IncompleteRead'错误解决

突然pip3不能正常使用了, 执行pip3 -V报错为如下: 瞬间崩溃,翻阅一些资料给出的解决方案均是 easy_install3 -U pip3 修复,试后仍然无法解决,随换另一种方法,重新安装pip3: apt-get re...

Sunki
40分钟前
5
0
Springboot Failed to parse configuration class [x]; nested exception

1.前言 在使用Springboot时,我们偶尔会单独引用一些特定的properties文件,在引用这些文件时,我们就应用到了注解:@PropertySource。 2.分析错误信息 Caused by: org.springframework.bea...

hengbao5
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部