[英]How is the built-in function str.lower() implemented?
我想知道str.lower()是如何在Python中實現的,所以我克隆了cpython存儲庫並使用grep進行了一些搜索。 從一開始幾跳后unicode_lower
在Objects/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.