Почему инспектор Пичарма жалуется на "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
Ответы
Ответ 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 в литерале, так как значения выводятся как кортеж.