Почему инспектор Пичарма жалуется на "d = {}"? - PullRequest
177 голосов
/ 07 декабря 2011

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

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

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

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

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

UPDATE:

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

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

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

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

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

Ответы [ 5 ]

227 голосов
/ 07 декабря 2011

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

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

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

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

dic = {'aaa': 5}

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

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

HTH!

12 голосов
/ 21 января 2018

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

  • Перейдите в Настройки -> Инспекции -> Python
  • Снимите флажок «Создание словаря можно переписать литералом словаря»
8 голосов
/ 13 июля 2017

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

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

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

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

, в итоге я получил следующее:

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

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

0 голосов
/ 17 апреля 2019

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

0 голосов
/ 10 августа 2018
mydict = {
  a: 5,
  b:z+c/2
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...