python利用capitalize()处理字符串,cpython源码溯源

python有很多处理str格式的方法,可以方便利用

capitalize():将首字母大写,其他字母变小写

def stringCase():
    info0='youngCase'
    str.capitalize(info0)
    print("首字母大写"+info0.capitalize())

官方python测试代码为

def test_capitalize(self):
        self.checkequal(' hello ', ' hello ', 'capitalize')
        self.checkequal('Hello ', 'Hello ','capitalize')
        self.checkequal('Hello ', 'hello ','capitalize')
        self.checkequal('Aaaa', 'aaaa', 'capitalize')
        self.checkequal('Aaaa', 'AaAa', 'capitalize')

深挖源码:尝试用vscode直接进入capitalize()函数,目录为:

结果为:

    @overload
    def capitalize(self: LiteralString) -> LiteralString: ...
    @overload
    def capitalize(self) -> str: ...  # type: ignore[misc]

并没有看到具体的实现方法:

Python的内置函数(用于cpython)是用C编写的,因此vscode提供了只显示函数签名的伪方法。因此需要查找包含源代码的GitHub页面:

 So,先在cpython中找到buitins.pyi对应的源文件,其他教程提示是在:

https://github.com/python/cpython/blob/main/Python/bltinmodule.c(其实不是)

我是在https://github.com/python/cpython/blob/main/Objects/bytearrayobject.c

找到了方法声明:

 点击stringlib_capitalize跳转到(到头文件了):

cpython/ctype.h at main · python/cpython · GitHub

tatic PyObject*
stringlib_capitalize(PyObject *self, PyObject *Py_UNUSED(ignored))
{
    PyObject* newobj;
    newobj = STRINGLIB_NEW(NULL, STRINGLIB_LEN(self));
    if (!newobj)
            return NULL;
    _Py_bytes_capitalize(STRINGLIB_STR(newobj), STRINGLIB_STR(self),
                      STRINGLIB_LEN(self));
    return newobj;
}

再点击_Py_bytes_capitalize跳转到:

cpython/bytes_methods.c at main · python/cpython · GitHub

得到如下代码

其实如注释所示:就是将首字母大写,后续字符置为小写.再后再返回


我也查找了java 的capitalize()实现,在import com.sun.xml.internal.ws.util.StringUtils后可以看到java的实现方式比较简单,只是将首字母进行大写,后续字符没有变小写。

 public static String capitalize(String name) {
        if (name != null && name.length() != 0) {
            char[] chars = name.toCharArray();
            chars[0] = Character.toUpperCase(chars[0]);
            return new String(chars);
        } else {
            return name;
        }
    }
}

【注:文章内容可能不正确,欢迎指正】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值