Подтвердить что ты не робот

Почему инспектор Пичарма жалуется на "d = {}"?

При инициализации словаря с помощью d = {} Инспектор кода Pycharm генерирует предупреждение, говоря

Это создание словаря можно переписать в виде словарного литерала.

Если я переписал его d = dict(), предупреждение исчезнет. Поскольку {} уже является литералом словаря, я уверен, что сообщение ошибочно. Кроме того, похоже, что оба d = {} и d = dict() действительны и Pythonic.

Этот связанный вопрос, похоже, заключает, что выбор - это всего лишь вопрос стиля/предпочтения: различия между "d = dict()" и "d = {}"

Почему Pycharm жалуется на d = {}?

UPDATE:

Mac прибил его. Предупреждение на самом деле применяется к нескольким строкам, а не только к тем, которые были помечены.

Кажется, что Pycharm ищет последовательность последовательных операторов, в которых вы инициализируете словарь, а затем устанавливаете значения в словаре. Например, это вызовет предупреждение:

d = {}
d['a'] = 1

Но этот код не будет:

d = {}
pass
d['a'] = 1
4b9b3361

Ответ 1

Что представляет собой следующий код для объявления словаря?

Я думаю, что pycharm вызовет ошибку, если у вас есть что-то вроде:

dic = {}
dic['aaa'] = 5

как вы могли бы написать

dic = {'aaa': 5}

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

dic = dict()
dic['aaa'] = 5

НТН!

Ответ 2

Это можно отключить в настройках проекта или по умолчанию.

  • Перейдите в Настройки → Инспекции → Python
  • Снимите флажок "Создание словаря может быть переписано литералом словаря"

Ответ 3

для тех, кто любит (как и я) для инициализации словарей с помощью одной операции

d = {
  'a': 12,
  'b': 'foo',
  'c': 'bar'
}

вместо многих строк, например

d = dict()
d['a'] = 12
d['b'] = ....

В конце концов я закончил с этим:

d = dict()
d.update({
  'a': 12,
  'b': 'foo',
  'c': 'bar'
})

Pycharm не жалуется на это

Ответ 4

mydict = {
  a: 5,
  b:z+c/2
}

Словарь мог быть создан непосредственно, не инициализируя их сначала, а затем переназначая новые значения.

Ответ 5

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

def get_other_values():
    return 3, 4

foo = {
    "a": 1,
    "b": 2
}
foo["c"], foo["d"] = get_other_values()

Итак, если я не создаю промежуточные переменные для вывода get_other_values, PEP8 генерирует это предупреждение, даже если я создаю диктат с литералами. И я не могу назначить клавиши c и d в литерале, так как значения выводятся как кортеж.