簡體   English   中英

內置函數str.lower()如何實現?

[英]How is the built-in function str.lower() implemented?

我想知道str.lower()是如何在Python中實現的,所以我克隆了cpython存儲庫並使用grep進行了一些搜索。 從一開始幾跳后unicode_lowerObjects/unicodeobject.c ,我碰到這里面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位,則會運行更復雜的代碼,否則將使用更簡單的版本。

首先讓我們看一下簡單的部分:

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

這只是將lower字段的值作為偏移量添加到輸入代碼點,將其分配到res return參數的第一位並返回1 (因為使用了一個字符)。

現在,對於更復雜的版本:

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;

在此版本中, lower字段被解釋為兩個不同的數字。 最低的16位是index ,而最高的位變為n (要輸出的字符數)。 然后,代碼循環遍歷_PyUnicode_ExtendedCase數組中從index開始的n字符,並將它們復制到res數組中。 最后,它返回使用的字符數。

需要這種更復雜的代碼來處理代表兩個字符的連字的Unicode代碼點的大小寫更改(通常是出於模糊的歷史原因,例如,因為它們在古老的可移動字體打印中位於單個字體塊上)。 如果其他情況下的字符重疊不大,則這些連字可能僅在一種情況下存在。 例如,字符'fl'是小寫字符'f''l'的連字。 沒有連字的大寫版本,因此'fl'.upper()需要返回兩個字符的字符串( 'FL' )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM