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

196

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

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

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

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

Почему Пичарм жаловался d = {}?

ОБНОВИТЬ:

Мак прибил это. Предупреждение фактически применяется к нескольким строкам, а не только к той, которая была помечена.

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

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

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

d = {}
pass
d['a'] = 1
Крис Сирс
источник
2
слишком шумно, и реального прироста производительности нет, просто еще один лишний осмотр
дашесы
То же самое происходит со списками: a = [1]; a.append (2), вероятно потому, что a = [1, 2] лучше ....
cleros
Ага. раздражающее сообщение. все эти подчеркивания PyCharm доставляют неудобства перед выполнением программы.
Раджкумар Р
Я обнаружил аналогичную проблему в JetBrains YouTrack - youtrack.jetbrains.com/issue/PY-19269#u=1461253420326 и там написано: В этом случае PyCharm предлагает вам указать значение something атрибута прямо в литерал dict вместо его назначения. на следующей строке.
Дудников из

Ответы:

245

Каков следующий код в объявлении вашего словаря?

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

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

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

dic = {'aaa': 5}

Кстати: тот факт, что ошибка исчезает, если вы используете функцию, не обязательно означает, что Pycharm считает dict()буквальным. Это может означать, что он не жалуется на:

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

НТН!

макинтош
источник
6
очевидно, что для всех этих бесполезных шумных проверок, к сожалению, некоторые мои коллеги вообще отключают это, это позор, потому что это полезно для многих вещей, таких как PEP, ..., реальных проблем и реальных подсказок производительности.
дашесы
В моем случае такой тип перезаписи невозможен, поскольку каждый создаваемый элемент словаря (но первый) зависит от предыдущего созданного элемента словаря. Таким образом, они должны быть назначены в словарь один за другим, а не каждый элемент одновременно. Тем не менее, PyCharm все еще жалуется и говорит, что я должен создать словарь как словарь литерала. Я думаю, что я должен использовать dic = dict()обходной путь ...
HelloGoodbye
@HelloGoodbye - Не зная проблемы, которую вы пытаетесь решить, я не могу высказать квалифицированное мнение, но вы не подумали начать с этого, d = { 'aaa': f1(something) }а d = f2(d)затем и d = f3(d)т.д. ... Или, альтернативно d['bbb'] = f2(d), d['ccc'] = f3(d)...?
Mac
Конструкция у меня есть d = {}, d['a'] = A, d['b'] = f(d['a']), d['c'] = f(d['b'])и т.д.
Hellogoodbye
5
@HelloGoodbye - Итак, почему бы не объединить первые два с, d = {'a': A}а затем просто сохранить последовательность, как вы обрисовали в общих чертах?
Mac
16

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

  • Перейдите в Настройки -> Инспекции -> Python
  • Снимите флажок «Создание словаря может быть переписано литералом словаря»
Крейг Джексон
источник
Это то, что я сделал и могу подтвердить, что это хорошо работает. Мой код был: payload = {** BASEPAYLOAD, ** ExtraPayload}, чтобы объединить два словаря, и он выдавал ошибку.
pa1983
9

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

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

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

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

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

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

Пихарм не жалуется на это

Igor.K
источник
7
Я съеживаюсь. :( Итак, вы на самом деле увеличили объем кода и сделали его менее понятным и работающим медленнее, просто чтобы избавиться от предупреждения в редакторе, который вы используете ... Я не использую pycharm, но я предполагаю, что есть некоторые своего рода переключатель конфигурации, который отключит предупреждение и позволит вам продолжать кодирование с помощью питона. :)
mac
2
@ Мак Я согласен сейчас. Я был молодым и глупым) с тех пор я изменился (немного) и просто отключил эти предупреждения
Igor.K
Ржунимагу! Это, должно быть, самый запоминающийся комментарий со смещением времени, который я когда-либо получал! ;)
Mac
0
mydict = {
  a: 5,
  b:z+c/2
}

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

Асним П Ансари
источник
0

У меня есть ситуация, когда это предупреждение выводит меня из себя. В моем случае я заполняю свой 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 в литерале, так как значения выводятся как кортеж.

Крис Вудфилд
источник