我想知道怎么做下部结构()是用Python实现的,因此我克隆了cpython存储库,并使用grep进行了一些搜索。在从Objects/unicodeobject.c
中的unicode_lower
开始跳了几下之后,我在Objects/unicodetype.c
中发现了这个:
int _PyUnicode_ToLowerFull(Py_UCS4 ch, Py_UCS4 *res)
{
const _PyUnicode_TypeRecord *ctype = gettyperecord(ch);
if (ctype->flags & EXTENDED_CASE_MASK) {
int index = ctype->lower & 0xFFFF;
int n = ctype->lower >> 24;
int i;
for (i = 0; i < n; i++)
res[i] = _PyUnicode_ExtendedCase[index + i];
return n;
}
res[0] = ch + ctype->lower;
return 1;
}
我熟悉C,但对python是如何实现的非常不熟悉(但是想改变一下!)。我真的不明白到底发生了什么,所以在这里寻求帮助以获得一些明确的解释。在
在您显示的函数中有两个分支。哪个分支运行取决于所讨论字符的
_PyUnicode_TypeRecord
字段的flags
字段。如果它有EXTENDED_CASE_MASK
位集,则运行更复杂的代码位,否则将使用更简单的版本。在让我们先看一下简单的部分:
这只需将
lower
字段的值作为输入代码点的偏移量,将其分配到res
返回参数的第一个位置并返回1
(因为它使用了一个字符)。在对于更复杂的版本:
^{pr2}$在这个版本中,
lower
字段被解释为两个不同的数字。最低的16位是index
,而最高的位变成n
(要输出的字符数)。然后,代码在_PyUnicode_ExtendedCase
数组中从index
开始的n
字符循环,并将它们复制到res
数组中。最后,它返回使用的字符数。在这种更复杂的代码需要处理代表两个字符连字的Unicode代码点的大小写更改(通常是因为一些模糊的历史原因,例如在古代的活字印刷中,它们本来是在一个单一的字块上)。这些连字可能只存在于一个单独的情况下,如果其他情况下的字符没有那么多的重叠。例如,字符}的连字。该连字不存在大写版本,因此
'fl'
是小写字符'f'
和{'fl'.upper()
需要返回一个两个字符的字符串('FL'
)。在相关问题 更多 >
编程相关推荐