关于python:字典的单数或复数标识符?

singular or plural identifier for a dictionary?

命名容器时,有什么更好的编码样式:

1
2
3
source = {}
#...
source[record] = some_file

要么

1
2
3
sources = {}
#...
sources[record] = some_file

复数在创造时更自然。 分配时的单数。

这不是一个无聊的问题。 当我不确定变量是容器还是单个值时,我确实陷入了旧代码的困惑。

UPDATE

似乎已经普遍同意,当将字典用作映射时,最好使用更详细的名称(例如recordToSourceFilename); 如果我绝对要使用缩写名,则将其复数(例如sources)。


我认为有两个带有字典的非常特殊的用例应单独标识。但是,在处理它们之前,应注意,字典的变量名几乎应始终为单数,而列表应几乎始终为复数。

  • 字典作为类对象的实体:有时您有一个字典来表示某种对象类数据结构。在这些情况下,字典几乎总是引用单个类似对象的数据结构,因此应为单数。例如:

    1
    2
    3
    4
    5
     # 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']
  • 字典作为映射实体:有时,字典的行为可能更像是典型的哈希映射。在这种情况下,最好使用更直接的名称,尽管仍为单数。例如:

    1
    2
    3
    4
    # assume that idToUser is a dictionary mapping IDs to user objects

    user = idToUser['0001a']
    print user.name
  • 列表:最后,您有了列表,这是一个完全独立的想法。这些几乎应该总是复数,因为它们是其他实体的简单集合。例如:

    1
    2
    3
    users = [userA, userB, userC] # makes sense
    for user in users:
        print user.name           # especially later, in iteration
  • 我敢肯定,在某些晦涩或不太可能发生的情况下,可能需要在此处进行一些例外处理,但是我认为这是在命名字典和列表时遵循的非常有力的指导原则,不仅是Python,而且是所有语言。


    应该是复数形式,因为这样程序的行为就像您大声朗读一样。让我告诉你为什么它不应该是奇异的(完全是人为的例子):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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!!
        ...

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

    1
    2
    3
    4
    5
    6
    # Customer ID => Customer
    idToCustomer = {}

    [...]

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


    我更喜欢容器的复数形式。使用中只有一种可以理解的逻辑:

    1
    2
    3
    entries = []
    for entry in entries:
         #Code...