PYTHON 源码阅读 – STRING
admin
2023-07-31 00:35:58
0
本周进展不大(去掉北上, 选择余地太小了), 下周开始投简历:(

这一章, 就一张图, 代码比较多


PyStringObject

源码位置 Include/stringobject.h |
Objects/stringobject.c

定义

123456789101112131415 typedef struct {  PyObject_VAR_HEAD  long ob_shash;  int ob_sstate;  char ob_sval[1];   /* Invariants:   *     ob_sval contains space for \’ob_size+1\’ elements.   *     ob_sval[ob_size] == 0.   *     ob_shash is the hash of the string or -1 if not computed yet.   *     ob_sstate != 0 iff the string object is in stringobject.c\’s   *       \’interned\’ dictionary; in this case the two references   *       from \’interned\’ to this object are *not counted* in ob_refcnt.   */} PyStringObject;

说明

12345678910111213 1. PyObject_VAR_HEADPyStringObject是变长对象, 比定长对象多了一个ob_size字段 2. ob_shash存储字符串的hash, 如果还没计算等于1string_hash被调用, 计算结果会被保存到这个字段一份, 后续不再进行计算 3. ob_sstate如果是interned, !=0, 否则=0interned后面说 4. char ob_sval[1]字符指针指向一段内存, char数组指针, 指向一个ob_size+1大小数组(c中字符串最后要多一个字符``表字符串结束)

结构

PyStringObject

构造方法

123 PyAPI_FUNC(PyObject *) PyString_FromString(const char *); PyAPI_FUNC(PyObject *) PyString_FromStringAndSize(const char *, Py_ssize_t);

两个构造方法其实区别不大,

123 PyString_FromStringAndSize 参数可以为`NULL`, 无论是否为`NULL`, 都会分配`size+1`个字节空间.(不为NULL的话字符数组会进行拷贝) PyString_FromString, 参数不能为`NULL`, 且必须是``结束的字符数组, 会调用c 语言string.h模块的strlen()函数计算字符串长度, 分配空间, 并将整个字符数组拷贝到ob_sval指向的内存

我们关注PyString_FromString就行

创建过程 PyString_FromString

定义

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667ta-line=\”crayon-5812b3c356d59815243318-63\”>6364656667/h1>

源码位置 Include/stringobject.h |
Objects/stringobject.c

定义

123456789101112131415 typedef struct {  PyObject_VAR_HEAD  long ob_shash;  int ob_sstate;  char ob_sval[1];   /* Invariants:   *     ob_sval contains space for \’ob_size+1\’ elements.   *     ob_sval[ob_size] == 0.   *     ob_shash is the hash of the string or -1 if not computed yet.   *     ob_sstate != 0 iff the string object is in stringobject.c\’s   *       \’interned\’ dictionary; in this case the two references   *       from \’interned\’ to this object are *not counted* in ob_refcnt.   */} PyStringObject;

说明

12345678910111213 1. PyObject_VAR_HEADPyStringObject是变长对象, 比定长对象多了一个ob_size字段 2. ob_shash存储字符串的hash, 如果还没计算等于1string_hash被调用, 计算结果会被保存到这个字段一份, 后续不再进行计算 3. ob_sstate如果是interned, !=0, 否则=0interned后面说 4. char ob_sval[1]字符指针指向一段内存, char数组指针, 指向一个ob_size+1大小数组(c中字符串最后要多一个字符``表字符串结束)

结构

PyStringObject

构造方法

123 PyAPI_FUNC(PyObject *) PyString_FromString(const char *); PyAPI_FUNC(PyObject *) PyString_FromStringAndSize(const char *, Py_ssize_t);

两个构造方法其实区别不大,

123 PyString_FromStringAndSize 参数可以为`NULL`, 无论是否为`NULL`, 都会分配`size+1`个字节空间.(不为NULL的话字符数组会进行拷贝) PyString_FromString, 参数不能为`NULL`, 且必须是``结束的字符数组, 会调用c 语言string.h模块的strlen()函数计算字符串长度, 分配空间, 并将整个字符数组拷贝到ob_sval指向的内存

我们关注PyString_FromString就行

创建过程 PyString_FromString

定义

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...