2012-02-08 3 views
15

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

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

или

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

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

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

UPDATE

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

+3

В основном я использую множественные формы для контейнеров, но я принимаю решение в каждом конкретном случае. Если вы запутались в особой форме, возможно, это намек. –

+1

@SvenMarnach: Пожалуйста, напишите свой ответ в качестве ответа. –

ответ

11

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

  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, но на всех языках.

+0

Пример в моем вопросе подпадает под (2). Полное имя - это 'recordToSourceFile'. Я вижу, как это очень ясно. Вы когда-нибудь использовали бы сокращенный 'источник' или' sources' в таком случае? – max

+0

В этом случае я мог видеть себя, используя «источники», но только если экземпляр был особенно хорошо документирован или мучительно очевидным. Сокращение велико, но расплывчатым не является. :) –

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

Если вы решили не использовать более явное имя 'idToCustomer' для словаря, вы бы использовали множественные« клиенты »? – max

+0

@max: Определенно, это просто делает больше смысла - как я пытался объяснить с помощью моих первых примеров. – AndiDog

5

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

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