единственное или множественное число для словаря? - PullRequest
17 голосов
/ 09 февраля 2012

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

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

или

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

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

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

UPDATE

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

Ответы [ 3 ]

15 голосов
/ 09 февраля 2012

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

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

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

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

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

6 голосов
/ 09 февраля 2012

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

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")
5 голосов
/ 09 февраля 2012

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

entries = []
for entry in entries:
     #Code...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...