Чому інспектор Pycharm скаржиться на "d = {}"?


196

При ініціалізації словника з d = {}кодом Pycharm інспектор формує попередження, кажучи

Це створення словника можна переписати як словник буквальне.

Якщо я його перепишу, d = dict()попередження проходить. Оскільки {}вже є словник буквальним, я майже впевнений, що повідомлення є помилковим. Крім того, схоже, що і те, d = {}і d = dict()дійсне і пітонічне.

З цього пов'язаного питання, мабуть, робиться висновок, що вибір - це лише питання стилю / уподобань: відмінності між "d = dict ()" та "d = {}"

Чому Pycharm скаржився на це d = {}?

ОНОВЛЕННЯ:

Мак прибив її. Попередження насправді застосовувалось до декількох рядків, а не лише до того, що було позначено прапором.

Здається, Pycharm шукає послідовність послідовних висловлювань, де ви ініціалізуєте словник, а потім встановлюєте значення у словнику. Наприклад, це спровокує попередження:

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

Але цей код не буде:

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

2
занадто галасливий, і справжнього підвищення продуктивності немає, просто ще одна зайва перевірка
тире

Те ж саме відбувається і для списків: a = [1]; a.append (2), ймовірно, тому, що a = [1, 2] приємніше ....
cleros

Так. дратівливе повідомлення. всі ці підкреслення PyCharm роблять одне незручне перед виконанням програми.
Rajkumar R

Я знайшов подібну проблему в JetBrains YouTrack - youtrack.jetbrains.com/issue/PY-19269#u=1461253420326, і в ній сказано: У цьому випадку PyCharm пропонує, ви можете вказати значення something атрибута прямо в прямому слові, а не призначати його. на наступному рядку.
Дудникоф

Відповіді:


245

Який наступний код у вашій декларації словника?

Я думаю, що pycharm спровокує помилку, якщо у вас є щось на кшталт:

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

як ви могли написати

dic = {'aaa': 5}

BTW: Те, що помилка усувається при використанні функції, не означає, що pycharm вважає dict(), що це буквально. Це може означати, що він не скаржиться на:

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

HTH!


6
мабуть, для всіх цих не корисних галасливих перевірок, на жаль, деякі мої колеги взагалі відключають це, прикро, бо це корисно для багатьох речей, як PEP, ..., справжні проблеми та реальні підказки щодо ефективності.
тире

У моєму випадку такий тип переписування неможливий, оскільки кожен створений словник (але перший) залежить від попереднього створеного словника. Таким чином, вони повинні бути призначені до словника один за одним, а не кожен елемент одночасно. Однак PyCharm все ще скаржиться і каже, що я повинен створити словник як словник буквальний. Я думаю, що мені доведеться скористатися dic = dict()
способом

@HelloGoodbye - Не знаючи проблеми, яку ви намагаєтеся вирішити, я не можу висловити кваліфіковану думку, але ви думали, починаючи з d = { 'aaa': f1(something) }того d = f2(d)часу d = f3(d)і т. Д. ... Або, як альтернатива d['bbb'] = f2(d), d['ccc'] = f3(d)...?
мак

Конструкція у мене є d = {}, d['a'] = A, d['b'] = f(d['a']), d['c'] = f(d['b'])і т.д.
Hellogoodbye

5
@HelloGoodbye - Отже, чому б не об'єднати перші два з, d = {'a': A}а потім просто зберегти послідовність, як ви окреслили?
мак

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'
})

Піхарм на це не скаржиться


7
Я скучаю. :( Отже, ви насправді збільшили кількість коду і зробили його менш зрозумілим і працює повільніше, щоб позбутися попередження в редакторі, який ви випадково використовуєте ... Я не використовую pycharm, але я б припустив, що є кілька вид перемикання конфігурації, який відключить попередження та дозволить продовжувати кодування пітонічним способом. :)
mac

2
@mac Я згоден зараз. Я був молодий і дурний) з тих пір я змінив (трохи) і просто відключив ці попередження
Igor.K

Лол! Це, мабуть, найпомітніший коментар про компенсацію часу, який я колись отримував! ;)
мак

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.