Python的命名规范:实际选择单词,符合PEP8要求。

3
我正在寻找一种更好的方法来命名Python中的所有内容。是的,我已经阅读了PEP8Spolsky's wonderful rant和其他各种文章。但我正在寻找更多在选择实际单词方面的指导。
是的,我知道 > 不明智的一致性是小心灵的妖怪。
但是,你可以保持与PEP8等的一致性,但仍然没有易于记忆的一致的变量/方法/类名称。 一致性是指如果您两次做出相同的决定,您将产生相同的名称。
例如,以下项目有多个符合PEP8的命名方式:
- 表中的列数 - 当前列号 - 列对象 - 列的总和

当决定使用num_colcount_col,而不是col_numcol_count时,这确实很容易(或反之亦然)。但是,我想看到一个经过一段时间测试/完善的示例。 我经常从给定的约定开始,然后随着探索新领域,它开始崩溃。

我猜我要找的不仅是每个前缀/根/标签/后缀应该做什么(在Spolsky文章中部分涉及了Apps Hungarian),而且还要有(许多)各种示例或生成每个的规则。

3个回答

4
我认为良好的面向对象设计可以消除对复杂变量命名约定的需求。在Spolsky的文章中,重点关注于变量命名如何帮助防止错误。我认为,在同一作用域中有许多变量时,这些错误更容易发生;通过将数据分组成对象,可以避免这种情况-然后,单个命名上下文只会有很少的变量,这些变量不需要组合名称。
命名约定的另一个目的是更好地记住名称。同样,面向对象的方法有所帮助(通过从用户外部隐藏大量数据);然后您需要的是一种命名方法的约定,而不是数据。此外,工具可以提供一个在某个范围内可用名称列表的帮助(再次,这些工具依赖于面向对象来完成它们的工作)。
在您特定的示例中,如果column是一个对象,我期望len(table)给出表中列数,sum(column)或column.sum()给出其总和;当前列只是for循环中的变量(通常是c或column)。

专注于在任何给定作用域中最小化变量数量是一个好主意。这确实有所帮助,但正如你指出的那样,方法命名仍然是一个问题。特别是当使用长时间未使用的模块时。良好的IDE只能提供有限的帮助。 - nazca

2
记住,在英语中,当两个模糊的单词相邻时,第一个单词变成了形容词,用来描述第二个单词。请遵循这个规则,总是用由两部分组成的名称,其中第一部分描述第二部分。
例如,col_num 是一个数字。什么样的数字?列数。
下一个规则是 of 这个单词。它是一个简短的好词,请不要忘记它。同样适用于复数形式和以 -ed 或 -d 结尾的过去式。甚至可能是 -ing。
例如,num_col 是一列。什么样的列?数字列。如果您真的想引用列数,则应编写 num_of_cols。Received date 是 recd_date 或 rcvd_date,而不是 rec_date 或 rcv_date。
英语读者对单词末尾的 -s 和 -d 非常敏感,以及短语中的 of,因此不要假设这样的短文本会被忽略。这是非常不可能的,因为我们从很小的时候就被编程注意到一些单词的结尾。
尽量保持一致,并保留您使用的任何单词或单词片段的术语表或数据字典。不要为两个不同的事物使用相同的片段。如果您使用 recd 来表示 received,并且您需要一个变量名来表示 recorded,则要么完全写出它,要么想出一个新的缩写并将其放入术语表中。如果您使用关系型数据库,请尽量与那里使用的命名约定保持一致。让数据库管理员知道您正在做什么,并告诉他们如何找到您的词汇表。

1

宇宙是多维的。

每个变量名至少有两个维度。

"总数","计数","列数","在表中"

"当前","索引","","在一列中"

"当前","列","",""

"某列中的某物品","的总和","",""

糟糕。这是不规则的。

更糟糕的是,我们可以选择任何东西作为“主”维度,并选择任何其他特征序列作为“次要”维度。

更糟糕的是,我们可能会有一个真正复杂的事情。 "总数","计数","非下划线","列数","在表中","具有偶数长度名称","来自字典","由","母亲的婚姻姓氏"。

坦白地说,没有可能的变量名模式可以系统地、可重复地包含“所有”知识。

不过还是要继续尝试。直到有人找到反例,这才是真正的乐趣和游戏。

你可以继续尝试,或者你可以简单地使用简洁明了的名称。如果你的名称范围很小(例如一个小的方法函数),就没有什么需要“记住”的了。这一切都清晰可见,在组成方法函数的20行代码中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接