Уникальный или множественный идентификатор словаря?

При наименовании контейнера, какой лучший стиль кодирования:

source = {}
#...
source[record] = some_file

или

sources = {}
#...
sources[record] = some_file

Множественное чтение более естественно при создании; единственное при присваивании.

И это не пустой вопрос; Я действительно поймал себя в замешательстве в старом коде, когда не был уверен, что переменная была контейнером или единственным значением.

UPDATE

Похоже, что существует общее согласие в том, что, когда словарь используется как сопоставление, лучше использовать более подробное имя (например, recordToSourceFilename); и если я абсолютно хочу использовать короткое имя, тогда сделайте его множественным (например, sources).

Ответы

Ответ 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']
    
  • Словари как объекты сопоставления:. В других случаях ваш словарь может вести себя как типичная хэш-карта. В таком случае лучше всего использовать более прямое имя, хотя оно все равно единственное. Например:

    # assume that idToUser is a dictionary mapping IDs to user objects
    
    user = idToUser['0001a']
    print user.name
    
  • Списки: Наконец, у вас есть списки, которые являются совершенно отдельной идеей. Они должны почти всегда быть множественными, потому что они просто представляют собой совокупность других объектов. Например:

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

Я уверен, что есть некоторые неясные или маловероятные ситуации, которые могут потребовать некоторых исключений, которые могут быть сделаны здесь, но я чувствую, что это довольно сильное руководство, которое следует придерживаться при названии словарей и списков, а не только на Python, но на всех языках.

Ответ 2

Это должно быть множественное число, потому что тогда программа ведет себя так же, как вы читаете ее вслух. Позвольте мне показать вам, почему это не должно быть сингулярным (полностью надуманный пример):

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 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")

Ответ 3

Я предпочитаю множественные числа для контейнеров. В использовании только определенной понятной логики:

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