Каков предпочтительный синтаксис для инициализации dict: фигурные фигуры скобки {} или функция dict()?

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

Я вижу два общих метода для инициализации dict:

a = {
    'a': 'value',
    'another': 'value',
}

b = dict( 
    a='value',
    another='value',
)

Что считается "более питоническим"? Что вы используете? Почему?

Ответ 1

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

Это работает:

a = {'import': 'trade', 1: 7.8}
a = dict({'import': 'trade', 1: 7.8})

Это не сработает:

a =                  dict(import='trade', 1=7.8)
>> SyntaxError: invalid syntax  ^

Ответ 2

Первые, фигурные скобки. В противном случае вы столкнетесь с проблемами согласованности с ключами, в которых есть нечетные символы, например =.

# Works fine.
a = {
    'a': 'value',
    'b=c': 'value',
}

# Eeep! Breaks if trying to be consistent.
b = dict( 
    a='value',
    b=c='value',
)

Ответ 3

Первая версия предпочтительнее:

  • Он работает для всех типов ключей, поэтому вы можете, например, сказать {1: 'one', 2: 'two'}. Второй вариант работает только для (некоторых) строковых ключей. Использование различных видов синтаксиса в зависимости от типа ключей было бы ненужной несогласованностью.
  • Это быстрее:

    $ python -m timeit "dict(a='value', another='value')"
    1000000 loops, best of 3: 0.79 usec per loop
    $ python -m timeit "{'a': 'value','another': 'value'}"
    1000000 loops, best of 3: 0.305 usec per loop
    
  • Если специальный синтаксис для словарных литералов не предназначен для использования, он, вероятно, не будет существовать.

Ответ 4

Я думаю, что первый вариант лучше, потому что вы собираетесь получить доступ к значениям как ['a'] или ['another']. Ключи в вашем словаре - это строки, и нет причин притворяться, что они не являются. Для меня синтаксис ключевых слов выглядит умным сначала, но неясным при втором взгляде. Это имеет смысл только для меня, если вы работаете с __dict__, и ключевые слова станут атрибутами позже, что-то вроде этого.

Ответ 5

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

    class mydict(dict): pass
    a = mydict()        
    a["b=c"] = 'value'
    a.test = False

Ответ 6

Я почти всегда использую фигурные скобки; однако в некоторых случаях, когда я пишу тесты, я делаю упаковку/распаковку ключевых слов, и в этих случаях dict() гораздо более удобен в обслуживании, поскольку мне не нужно менять:

a=1,
b=2,

в:

'a': 1,
'b': 2,

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

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

В тестах и реализации я бы никогда не использовал dict(), если есть вероятность, что ключи, добавленные тогда или в будущем, будут либо:

  • Не всегда быть строкой
  • Не только содержит цифры, буквы ASCII и подчеркивания
  • Начните с целого числа (dict(1foo=2) вызывает SyntaxError)

Ответ 7

Иногда dict() - хороший выбор:

a=dict(zip(['Mon','Tue','Wed','Thu','Fri'], [x for x in range(1, 6)]))

mydict=dict(zip(['mon','tue','wed','thu','fri','sat','sun'],

[random.randint(0,100) для x в диапазоне (0,7)]))