看一个人的代码,我第一眼就瞅他怎么用词。别笑,这事儿比你想象的要严肃得多。算法?框架?设计模式?那些都是硬功夫,但python怎么用词,或者说,命名,这门手艺,才是代码的灵魂,是你作为一个开发者,品味和教养的直接体现。
代码这东西,说白了,就是一篇写给未来自己和同事看的小说。你总不希望几个月后,自己回头看,跟看天书似的,挠破头皮都想不起来当初 data1
和 data2
到底是个啥玩意儿吧?那不是写代码,那是给自己挖坑,是给团队制造精神内耗。
所以,聊聊这事儿。不扯那些枯燥的 PEP 8 规范条文,咱们聊点有血有肉的,聊点“人话”。
变量:故事里的名词,得有鼻子有眼
变量,就是你故事里的一个个角色、一个个物件。你管他叫“那个人”,还是叫“穿着红色风衣、跛着脚的侦探老王”?差别大了去了。
别再用 a
, b
, c
, x
, y
, z
了,求你了。除非你在解一道纯数学题,否则,这就是懒惰,是智力上的投降。看到这种代码,我血压就上来了。
一个好的变量名,应该是自解释的。你一看它,就大概知道它的类型、它的用途、它的存在意义。
比如,你要存用户的名字:
– 别这样: u
或者 name
(太泛了,啥名字?)
– 可以这样: user_name
– 更好的是: customer_name
或者 admin_username
,如果上下文需要更精确。
再比如,处理时间:
– 灾难现场:t
或者 time
– 有点意思了: start_time
, end_time
– 这才叫专业: start_time_in_ms
(毫秒), retry_interval_seconds
(秒)
看到了吗?单位!带上单位!这能避免无数潜在的 bug。timeout = 5
是 5 秒还是 5 分钟?鬼知道。timeout_in_seconds = 5
,清清楚楚,明明白白。
别怕名字长。真的,别怕。现代的 IDE 都有自动补全,你多打几个字母,换来的是未来几个小时甚至几天的心智清净,这笔买卖,血赚。max_retry_attempts
比 mra
好一万倍。前者是说明书,后者是摩斯电码。
我管这种命名方式叫“场景还原命名法”。一个变量名,就能让你脑子里浮现出它所在的业务场景。这才是代码可读性的精髓。
函数与方法:故事里的动词,讲究一个“干啥”
如果变量是名词,那函数就是动词。它代表一个动作,一个过程,一个行为。所以,函数名,天生就该是动词或者动宾短语。
你希望你的函数名是在陈述一个事实,还是在发布一个命令?
user_data()
:嗯?这是数据本身,还是获取数据的动作?不清楚。get_user_data()
:漂亮!动词开头,get_
,我一看就知道,哦,这是要去取点什么东西回来。
一些常见的“动词前缀”,简直就是代码里的交通信号灯:
get_
:获取数据,通常有返回值,且不改变系统状态。get_active_users()
set_
:设置值,修改状态。set_user_password()
is_
/has_
:返回布尔值,用于判断。is_logged_in()
,has_permissions()
create_
/build_
:创建一个新的东西。create_new_order()
calculate_
/compute_
:进行计算,返回结果。calculate_tax()
一个函数的名字,就是你和调用者之间的一个契约。calculate_tax(price, region)
,这个名字就承诺了,它会根据价格和地区计算税费,并且仅仅做这件事。如果它背地里还偷偷发了个邮件,那就是欺骗,是背叛!这种函数,就是代码里的“渣男”,迟早要出事。
所以,一个函数只做一件事,并且用它的名字把这件事说清楚。这是最重要的一条军规。
类(Class):故事的主角,大写开场
类,就是你代码世界里的“物种定义”。它是蓝图,是模板。比如“人”这个类,定义了人有姓名、年龄这些属性,有吃饭、睡觉这些行为。所以,类的命名,天生就该是个名词,而且,按照约定俗成,用PascalCase
(或者叫 CapWords
)风格,也就是每个单词首字母大写。
User
HttpRequest
DatabaseConnection
OrderProcessor
看到大写字母开头的,你的大脑就会立刻把它识别为一个“类型”,一个“概念”,一个“主角”。这是一种心理暗示,非常有效。
别把类命名成 ManageUsers
这种动词短语,那是函数干的活儿。类应该是 UserManager
,这个“管理者”本身。
常量:宇宙的法则,不容改变
常量,就是你程序里写死的、不会变的“真理”。比如圆周率,比如一个配置项的最大连接数。它们是代码世界里的地标,是基石。
为了以示尊重,我们用ALL_CAPS_WITH_UNDERSCORES
(全大写,下划线连接)来命名。
PI = 3.14159
MAX_CONNECTIONS = 10
DEFAULT_TIMEOUT_SECONDS = 30
当你看到一个全大写的变量,你心里就得有个警钟:别动它!这是规矩!
那些该扔进垃圾桶的“坏词”
聊完了好的,再来批判一下那些让人头疼的“坏词”,也就是命名的反模式。
- 意义不明的单字母:除了
i, j, k
在简单的 for 循环里,e
在except
块里,其他的,有一个算一个,都该被批斗。 - 含糊不清的缩写:
calc_res
到底是 “calculate result” 还是 “calculation resource”?别让别人猜。 - 数据类型当名字:
user_list
,name_string
,age_int
。拜托,这是 Python,不是上古 C 语言。你的 IDE 悬停一下什么类型都知道了,这种命名除了啰嗦,毫无意义。我们关心的是它的业务含义,不是它的计算机类型。叫active_users
不比user_list
香吗? - 数字序列:
user1
,user2
,user3
。看到这个,我就知道你八成是需要一个列表或者字典了。这是结构设计出了问题,想用命名来找补,结果越补越烂。
结语:命名,是一场关于“共情”的修行
说到底,python怎么用词,或者说写代码怎么命名,它根本就不是一个纯粹的技术问题。它是一个沟通问题,是一个共情问题。
你得能共情未来的你,那个已经忘了所有细节、焦头烂额的你。
你得能共情你的同事,那个需要接手你代码、可能在深夜里默默问候你家人的同事。
好的命名,就像在崎岖的山路上铺设的台阶,清晰、稳固,让后来者可以轻松、愉快地前行。而坏的命名,就像在代码里挖的一个个小土坑,一不留神就崴了脚,摔个大跟头。
记住那句被说烂了但永远正确的话:
代码是写给人读的,只是顺便让机器执行。
你的每一个变量名,每一个函数名,都在构建一个世界。希望你的那个世界,是一个清晰、优雅、充满善意的世界。这,比你多会一种花里胡哨的算法,重要得多。
评论(0)