内置功能如何下部结构()实施?

2024-04-25 01:42:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道怎么做下部结构()是用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是如何实现的非常不熟悉(但是想改变一下!)。我真的不明白到底发生了什么,所以在这里寻求帮助以获得一些明确的解释。在


Tags: pyindexreturnobjectsunicodereschcpython
1条回答
网友
1楼 · 发布于 2024-04-25 01:42:09

在您显示的函数中有两个分支。哪个分支运行取决于所讨论字符的_PyUnicode_TypeRecord字段的flags字段。如果它有EXTENDED_CASE_MASK位集,则运行更复杂的代码位,否则将使用更简单的版本。在

让我们先看一下简单的部分:

res[0] = ch + ctype->lower;
return 1;

这只需将lower字段的值作为输入代码点的偏移量,将其分配到res返回参数的第一个位置并返回1(因为它使用了一个字符)。在

对于更复杂的版本:

^{pr2}$

在这个版本中,lower字段被解释为两个不同的数字。最低的16位是index,而最高的位变成n(要输出的字符数)。然后,代码在_PyUnicode_ExtendedCase数组中从index开始的n字符循环,并将它们复制到res数组中。最后,它返回使用的字符数。在

这种更复杂的代码需要处理代表两个字符连字的Unicode代码点的大小写更改(通常是因为一些模糊的历史原因,例如在古代的活字印刷中,它们本来是在一个单一的字块上)。这些连字可能只存在于一个单独的情况下,如果其他情况下的字符没有那么多的重叠。例如,字符'fl'是小写字符'f'和{}的连字。该连字不存在大写版本,因此'fl'.upper()需要返回一个两个字符的字符串('FL')。在

相关问题 更多 >