Python中实际选择单词的命名规范,符合PEP8
我想在Python中找到一种更好的命名方式。是的,我看过PEP8、Spolsky的精彩论述以及其他一些文章。但我希望能有更多的指导,帮助我选择实际的单词。
我知道
愚蠢的一致性是小心思的妖怪。
不过,你可以遵循PEP8等规范,但仍然可能没有一致且容易记住的变量、方法或类名。这里的一致性是指,如果你遇到同样的选择两次,你应该能给出相同的名字。
举个例子,下面这些内容有多种符合PEP8的命名方式:
- 表格中的列数
- 当前列的编号
- 列对象
- 列的总和
没错,决定使用像num_col
和count_col
这样的命名,而不是col_num
和col_count
(或者反过来)其实很简单。但我想看到一些经过测试和改进的例子。我通常会从某种约定开始,但当我进入新领域时,这种约定往往会崩溃。
我想要的不仅仅是前缀、根词、标签或后缀应该做什么(这在Spolsky的文章中部分提到过Apps Hungarian),还希望有很多例子,或者生成每个命名的规则。
3 个回答
宇宙是多维的。
每个变量名至少有两个维度。
比如说,“总数”、“计数”、“列数”、“在一个表里”。
还有“当前”、“索引”、“列的”、“”。
再比如“当前”、“列”、“”、“”。
还有“某个东西的总和”、“在一列里”。
真麻烦,这些命名不规则。
更糟糕的是,我们可以随便选择一个作为“主要”维度,然后再选择其他特征作为“次要”维度。
甚至更复杂的情况是,“非下划线列的总数”、“在表里”、“名字长度为偶数”、“来自字典”、“以母亲的姓氏为键”。
坦白说,没有一种变量命名的规则可以系统地、可重复地涵盖“所有”知识。
不过,继续尝试吧。总是有趣的,直到有人找到反例。
你可以继续尝试,或者干脆使用简单明了的名字。如果你的命名范围很小(比如一个小方法),那就没有什么需要“记住”的。所有内容在这20行代码里都是一目了然的。
记住,在英语中,当两个模糊的词放在一起时,第一个词通常会变成形容词,用来描述第二个词。所以尽量遵循这个规则,给事物命名时用两个部分,第一个部分描述第二个部分。
比如说,col_num 是一个数字。那是什么样的数字呢?是一个列号。
下一个规则是“of”这个词。它是个简短的词,所以请不要省略它。复数形式和过去式的词尾 -ed 或 -d 也要注意,甚至 -ing 也要考虑。
例如,num_col 是一个列。那是什么样的列呢?是一个数字列。如果你真的想表示列的数量,应该写成 num_of_cols。接收日期应该写成 recd_date 或 rcvd_date,而不是 rec_date 或 rcv_date。
说英语的人对单词结尾的 -s 和 -d 以及短语中间的 of 非常敏感,所以不要以为这些短小的词会被忽略。其实不太可能,因为我们从小就被训练去注意这些词尾。
尽量保持一致性,建立一个词汇表或数据字典,记录你使用的任何词或词的片段。不要用同一个片段来表示两个不同的意思。如果你用 recd 来表示 received,而你需要一个变量名表示 recorded,那就要么写全称,要么想一个新的缩写,并把它放在词汇表里。如果你使用关系型数据库,尽量和那里的命名规则保持一致。让数据库管理员知道你在做什么,并告诉他们在哪里可以找到你的词汇表。
我认为,复杂的变量命名规则在良好的面向对象设计下就不再必要了。在Spolsky的文章中,很多内容都强调了变量命名如何帮助防止错误。我觉得,当你在同一个范围内有很多变量时,错误更容易发生;而通过将数据分组到对象中,可以避免这种情况。这样的话,一个命名的上下文里只有少量变量,就不需要复杂的组合名称了。
命名规则的另一个目的就是让人更容易记住这些名字。同样,面向对象的设计也有帮助(因为它可以将很多数据隐藏起来,外部用户看不到)。这时你需要的是一种命名方法的规则,而不是数据的规则。此外,还有一些工具可以提供你在特定范围内可用名称的列表(这些工具同样依赖于面向对象的设计来完成工作)。
在你提到的具体例子中,如果列是一个对象,我会期待 len(table)
返回表格中的列数,sum(column)
或 column.sum()
返回列的总和;而当前的列就是在循环中的变量(通常是 c
或 column
)。