字典的单数还是复数标识符?

20

命名一个容器时,哪种编码风格更好:

source = {}
#...
source[record] = some_file
或者
sources = {}
#...
sources[record] = some_file

在创建时使用复数名词更自然;在赋值时使用单数名词更自然。

这不是一个无关紧要的问题;我曾经在旧代码中因为不确定变量是容器还是单个值而感到困惑。

更新

似乎有一般性的共识认为,当字典被用作映射时,最好使用更详细的名称(如recordToSourceFilename);如果我非常想使用简短的名称,那么将其改成复数形式(例如sources)。


3
我通常使用容器的复数形式,但我会根据具体情况来决定。如果你对单数形式感到困惑,那也许是一个提示。 - Sven Marnach
1
@SvenMarnach:请将您的答案发布为答案。 - S.Lott
3个回答

21

我认为有两种非常具体的使用情况需要单独识别字典。然而,在解决这些问题之前,应该注意到字典的变量名几乎总是单数,而列表则几乎总是复数。

  1. 将字典用作类似对象的实体:有时您会有一个表示某种类似对象数据结构的字典。在这些情况下,字典几乎总是指代单个类似对象的数据结构,因此应该是单数。例如:

     # assume that users is a list of users parsed from some JSON source
     # assume that each user is a dictionary, containing information about that user
    
     for user in users:
         print user['name']
    
  2. 作为映射实体的字典:有时,你的字典可能更像一个典型的哈希映射。在这种情况下,最好使用一个更直接的名称,但仍然是单数形式。例如:

  3. # assume that idToUser is a dictionary mapping IDs to user objects
    
    user = idToUser['0001a']
    print user.name
    
  4. 列表:最后,你还有列表,这是一个完全独立的概念。它们几乎总是复数,因为它们只是其他实体的集合。例如:

  5. users = [userA, userB, userC] # makes sense
    for user in users:
        print user.name           # especially later, in iteration
    

    我确信可能存在一些罕见或不太可能发生的情况需要对此进行一些例外,但我认为这是一个相当强的指导方针,不仅适用于Python中的字典和列表命名,而且适用于所有语言。


我的问题示例属于(2)。全名是recordToSourceFile。我可以看出它非常清晰。在这种情况下,您会使用缩写sourcesources吗? - max
如果实例被特别详细地记录或异常明显,我可以看到自己在这种情况下使用“sources”,但仅此而已。速记很棒,但模糊不清是不好的。 :) - Patrick Perini

6

应该使用复数形式,因为这样程序的行为就像你大声朗读它一样。让我用一个非常牵强的例子来说明为什么不应该使用单数形式:

c = Customer(name = "Tony")
c.persist()

[...]

#
# 500 LOC later, you retrieve the customer list as a mapping from
# customer ID to Customer instance.
#

# Singular
customer = fetchCustomerList()
nameOfFirstCustomer = customer[0].name
for c in customer: # obviously it's totally confusing once you iterate
    ...

# Plural
customers = fetchCustomerList()
nameOfFirstCustomer = customers[0].name    
for customer in customers: # yeah, that makes sense!!
    ...

此外,有时候最好使用更加明确的名称来推断映射(对于字典)和可能的类型。当我引入一个字典变量时,我通常会添加一个简单的注释。例如:

# Customer ID => Customer
idToCustomer = {}

[...]

idToCustomer[1] = Customer(name = "Tony")

如果您选择不使用更明确的名称“idToCustomer”来命名字典,那么您会使用复数形式的“customers”吗? - max
@max:当然,这样做更有意义——就像我在第一个例子中试图解释的那样。 - AndiDog

5

我更喜欢在容器中使用复数形式。这样做有一定的可理解逻辑:

entries = []
for entry in entries:
     #Code...

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