Python代码阅读(第21篇):将变量名称转换为蛇式命名风格
Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码
本篇阅读的代码实现将变量名称转换为蛇式命名风格(snake case)的功能。
本篇阅读的代码片段来自于30-seconds-of-python。
snake
from re import sub
def snake(s):
return '_'.join(
sub('([A-Z][a-z]+)', r' \1',
sub('([A-Z]+)', r' \1',
s.replace('-', ' '))).split()).lower()
# EXAMPLES
snake('camelCase') # 'camel_case'
snake('some text') # 'some_text'
snake('some-mixed_string With spaces_underscores-and-hyphens') # 'some_mixed_string_with_spaces_underscores_and_hyphens'
snake('AllThe-small Things') # "all_the_small_things"
snake
函数使用正则表达式将字符串变形、分解成单词,并加上_
作为分隔符组合起来。函数主要使用了re
模块的sub
、str.replace
、str.split
、str.lower
和str.join
。在正式分析snake
函数的逻辑之前,先介绍下其中使用到的其他函数的作用。
str.replace(old, new[, count])
返回字符串的副本,其中出现的所有子字符串old
都将被替换为new
如果给出了可选参数count
,则只替换前count
次出现。
str.split(sep=None, maxsplit=-1)
返回一个由字符串内单词组成的列表,使用sep
作为分隔字符串。 如果给出了maxsplit
,则最多进行maxsplit
次拆分(因此,列表最多会有maxsplit+1
个元素)。 如果maxsplit
未指定或为-1
,则不限制拆分次数(进行所有可能的拆分)。
如果sep
未指定或为None
,则会应用另一种拆分算法:连续的空格会被视为单个分隔符,开头和结尾如果包含空格的话,将不会拆分出空字符串。 因此,使用None
拆分空字符串或仅包含空格的字符串将返回 []
。
>>> '1 2 3'.split()
['1', '2', '3']
>>> '1 2 3'.split(maxsplit=1)
['1', '2 3']
>>> ' 1 2 3 '.split()
['1', '2', '3']
str.join(iterable)
返回一个由iterable
中的字符串拼接而成的字符串。
str.lower()
返回原字符串的副本,其所有区分大小写的字符均转换为小写。
re.sub(pattern, repl, string, count=0, flags=0)
返回通过使用repl
替换在string
最左边非重叠出现的pattern
而获得的字符串。 如果样式没有找到,则不加改变地返回string
。repl
可以是字符串或函数。 向后引用像是\6
会用样式中第6
组所匹配到的子字符串来替换。 例如下面的例子中第一组匹配到的是myfun
,所以在替换的时候,\1
使用myfun
替换,所以在结果中\npy_
后面接着的是myfun
。
带有'r'
前缀的字符串是原始字符串,反斜杠不必做任何特殊处理。 因此r”\n”
表示包含'\'
和'n'
两个字符的字符串,而"\n"
则表示只包含一个换行符的字符串。
>>> re.sub(r'def\s+([a-zA-Z_][a-zA-Z_0-9]*)\s*\(\s*\):',
... r'static PyObject*\npy_\1(void)\n{',
... 'def myfunc():')
'static PyObject*\npy_myfunc(void)\n{'
snake
执行逻辑
首先分析一下snake
函数最里面的sub
函数。先看下输入参数。
string
是s.replace('-', ' ')
将待转换的字符串中的'-'
使用' '
替换。
pattern
是'([A-Z]+)'
,其中(...)
表示他是一个组合,匹配括号内的正则表达式,并在匹配完成之后,组合的内容可以被获取,并可以在之后用\number
转义序列进行再次匹配或使用,例如上个例子中的\1
。'([A-Z]+)'
的组合表示要匹配一个或多个大写字母,并尽可能匹配出最长的子字符串。
repl
是r' \1'
,代表使用组合匹配出来的字符串前增加一个空格,替换匹配出来的字符串。例如'abcDEF'
经过匹配和替换将变成'abc DEF'
。sub('([A-Z]+)', r' \1', 'abcDEF') # 'abc DEF'
因此,snake
函数最里面的sub
函数的输出是将原始字符串中的'-'
使用' '
替换,再匹配字符串中的一个或多个连续的大些字母,在前面增加一个空格。例如原始字符串是'abc-abcDEF-ABc'
经过第一个sub
函数转换后变成'abc abc DEF ABc'
(注意'ABc'
前面有两个空格)。
接下来再分析一下第二层的sub
函数。还是先看一下输入参数。
string
是上个sub
的输出,在前面的例子中,是'abc abc DEF ABc'
(注意'ABc'
前面有两个空格)。
pattern
是'([A-Z][a-z]+)'
。它也是一个组合,表示要匹配一个大写字母后面跟着一个或多个小写字母的形式,并尽可能匹配出最长的子字符串。
repl
还是r' \1'
,代表使用组合匹配出来的字符串前增加一个空格,替换匹配出来的字符串。
因此,第二层sub
的输出是简单的匹配一个大写字母后面跟着一个或多个小写字母的形式,在前面加一个空格。继续使用前面的例子,这层的输入字符串是'abc abc DEF ABc'
(注意'ABc'
前面有两个空格),输出是'abc abc DEF A Bc'
(注意'A'
前面有两个空格)。
然后snake
函数将第二层sub
输出的字符串使用str.split
函数分成字符串列表。再将得到的字符串列表使用'-'
作为分隔符组合起来。最后使用str.lower
将组合后的字符串转换成小写。延续上面的例子,最终输出的字符串为:'abc_abc_def_a_bc'
Python代码阅读(第21篇):将变量名称转换为蛇式命名风格的更多相关文章
- Python代码阅读(第8篇):列表元素逻辑判断
Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的三份代码的功能分别是判断列表中的元素是否都符合给定的条件:判断列表中是否存在符合给定的条件的元素:以及判断列表中 ...
- Python代码阅读(第11篇):展开嵌套列表
Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的代码实现了展开嵌套列表的功能,将一个嵌套的list展开成一个一维list(不改变原有列表的顺序). 本篇阅读的代 ...
- Python代码阅读(第12篇):初始化二维数组
Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的代码实现了二维数组的初始化功能,根据给定的宽高初始化二维数组. 本篇阅读的代码片段来自于30-seconds-o ...
- Python 基础【第八篇】变量
1.变量定义: 给数据进行命名,数据的名字就叫做变量 2.变量格式: [变量名] = [值] 注:变量名命名需要满足下面两条准则 准则一:标示符开头不能为数字.不能包含空格.特殊字符准则二:标示符不能 ...
- Python代码阅读(第2篇):数字转化成列表
本篇阅读的代码实现了将输入的数字转化成一个列表,输入数字中的每一位按照从左到右的顺序成为列表中的一项. 本篇阅读的代码片段来自于30-seconds-of-python. digitize def d ...
- Python代码阅读(第1篇):列表映射后的平均值
本篇阅读的代码实现了将列表进行映射,并求取映射后的平均值. 本篇阅读的代码片段来自于30-seconds-of-python. average_by def average_by(lst, fn=la ...
- Python代码阅读(第10篇):随机打乱列表元素
本篇阅读的代码实现了随机打乱列表元素的功能,将原有列表乱序排列,并返回一个新的列表(不改变原有列表的顺序). 本篇阅读的代码片段来自于30-seconds-of-python. shuffle fro ...
- SourceInsight支持Python代码阅读
这个话题,很简单,主要是要有一个插件Python.CLF,这个文件可以从我的GitHub上下载.然后,参照下面的图片显示的步骤,就很快搞定! 具体的步骤,看下面的三张图片,顺序编号了,从1到9,对照着 ...
- Python 代码风格
1 原则 在开始讨论Python社区所采用的具体标准或是由其他人推荐的建议之前,考虑一些总体原则非常重要. 请记住可读性标准的目标是提升可读性.这些规则存在的目的就是为了帮助人读写代码,而不是相反. ...
随机推荐
- JS 之 每日一题 之 算法 ( 有多少小于当前数字的数字 )
给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目. 换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 ...
- Selenium系列(十九) - Web UI 自动化基础实战(6)
如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...
- FlinkCDC 2.0使用实践体验
一.背景说明 所谓CDC:全称是 Change Data Capture ,在广义的概念上,只要能捕获数据变更的技术,我们都可以称为 CDC .通常我们说的 CDC 技术主要面向数据库的变更,是一种用 ...
- python模块--collections(容器数据类型)
Counter类(dict的子类, 计数器) 方法 返回值类型 说明 __init__ Counter 传入可迭代对象, 会对对象中的值进行计数, 值为键, 计数为值 .elements() 迭代器 ...
- 剑指 Offer 60. n个骰子的点数
剑指 Offer 60. n个骰子的点数 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n ...
- C语言使用getch()读取方向键
初衷: 在解决N皇后问题时需要使用方向键实现布局切换,于是就在网上查找资料,感觉自己收获不小,就把自己总结的一些知识点给记录下来. 总结: 1.getch()读取字符需要一次. 2.getch()读取 ...
- Django学习day13随堂笔记
每日测验 """ 今日考题 1.什么是django中间件,它的作用是什么,如何自定义中间件,里面有哪些用户可以自定义的方法,这些方法有何特点 2.基于django中间件的 ...
- 做PPT总是很难找到好看、有质感的图片,怎么办?
1.制作PPT时,要想提升整体质感,就需要插入一些图片.当你进入到这个阶段,就意味着你剩下用来做PPT的时间,可能比较紧张了.所以,你的重中之重是,在最短的时间内找到合适的照片. 2.想快速找到好看. ...
- P6113-[模板]一般图最大匹配【带花树】
正题 题目链接:https://www.luogu.com.cn/problem/P6113 题目大意 给出一张无向图,求最大匹配. \(1\leq n\leq 10^3,1\leq m\leq 5\ ...
- 深入浅出WPF-02.WPF系列目录
WPF系列目录 2. XAML认识 3. XAML语法 4. x名称空间详解 5. 控件与布局 6. 绑定Binding-01 6. 绑定Binding-02 6. 绑定Binding-03 7. 属 ...