Dlaczego inspektor Pycharm narzeka na „d = {}”?


195

Podczas inicjowania słownika za d = {}pomocą kodu Pycharm inspektor generuje ostrzeżenie, mówiąc:

To tworzenie słownika można przepisać jako dosłowne.

Jeśli go przepiszę, d = dict()ostrzeżenie zniknie. Skoro {}już jest słownikiem dosłowny, jestem całkiem pewny, że komunikat jest błędny. Ponadto wydaje się, że zarówno d = {}i d = dict()są ważne i pythonowy.

To pokrewne pytanie wydaje się stwierdzać, że wybór jest tylko kwestią stylu / preferencji: różnic między „d = dict ()” a „d = {}”

Dlaczego Pycharm miałby narzekać d = {}?

AKTUALIZACJA:

Mac go przybił. Ostrzeżenie faktycznie dotyczyło wielu wierszy, a nie tylko tego, który został oflagowany.

Wygląda na to, że Pycharm szuka sekwencji kolejnych instrukcji, w których inicjujesz słownik, a następnie ustawiasz wartości w słowniku. Na przykład spowoduje to wyświetlenie ostrzeżenia:

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

Ale ten kod nie będzie:

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

2
zbyt głośno, i nie ma prawdziwego wzrostu wydajności, tylko jedna dodatkowa kontrola
dashy

To samo dzieje się z listami: a = [1]; a.append (2), prawdopodobnie dlatego, że a = [1, 2] jest ładniejszy ....
cleros

tak. irytująca wiadomość. wszystkie te podkreślenia PyCharm sprawiają, że nie jest wygodnie przed uruchomieniem programu.
Rajkumar R

Znalazłem podobny problem w JetBrains YouTrack - youtrack.jetbrains.com/issue/PY-19269#u=1461253420326 i mówi: W tym przypadku PyCharm sugeruje, że możesz podać wartość something atrybutu bezpośrednio do literału słownika, zamiast przypisywać go w następnej linii.
Dudnikof,

Odpowiedzi:


244

Jaki jest następujący kod do deklaracji w słowniku?

Myślę, że pycharm spowoduje błąd, jeśli masz coś takiego:

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

jak mogłeś napisać

dic = {'aaa': 5}

BTW: Fakt, że błąd zniknie, jeśli użyjesz tej funkcji, niekoniecznie oznacza, że ​​pycharm uważa, że dict()jest dosłowne. Może to po prostu oznaczać, że nie narzeka na:

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

HTH!


6
najwyraźniej jest to dla wszystkich tych nieprzydatnych hałaśliwych inspekcji, niestety niektórzy z moich kolegów całkowicie to wyłączają, szkoda, ponieważ jest użyteczny dla wielu rzeczy, takich jak PEP, ..., prawdziwe problemy i prawdziwe wskazówki dotyczące wydajności.
dashy

W moim przypadku ten typ przepisywania nie jest możliwy, ponieważ każdy utworzony element słownika (ale pierwszy) zależy od wcześniej utworzonego elementu słownika. Dlatego muszą być przypisywane do słownika jeden po drugim, a nie do każdego elementu w tym samym czasie. Jednak PyCharm nadal narzeka i mówi, że powinienem stworzyć słownik jako dosłowny słownik. Chyba muszę skorzystać z dic = dict()obejścia ...
HelloGoodbye,

@HelloGoodbye - Nie znając problem, który próbujesz rozwiązać nie mogę wyrazić opinię z zastrzeżeniami, ale czy za zaczynając d = { 'aaa': f1(something) }następnie d = f2(d)następnie d = f3(d)itd ... Lub alternatywnie d['bbb'] = f2(d), d['ccc'] = f3(d)...?
Mac

Konstrukcja mam jest d = {}, d['a'] = A, d['b'] = f(d['a']), d['c'] = f(d['b']), itd.
Hellogoodbye

5
@HelloGoodbye - Dlaczego więc nie połączyć pierwszych dwóch, d = {'a': A}a następnie zachować sekwencję zgodnie z opisem?
Mac

15

Można to wyłączyć w Ustawieniach projektu lub Ustawieniach domyślnych.

  • Przejdź do Ustawienia -> Inspekcje -> Python
  • Odznacz „Tworzenie słownika można przepisać dosłownie ze słownika”

To właśnie zrobiłem i mogę potwierdzić, że działa dobrze. Mój kod brzmiał: ładunek = {** BASEPAYLOAD, ** ExtraPayload}, aby połączyć dwa słowniki i zgłosił błąd.
pa1983

9

dla tych, którzy lubią (tak jak ja) inicjować słowniki za pomocą jednej operacji

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

zamiast wielu linii takich jak

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

w końcu skończyło się na tym:

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

Pycharm nie narzeka na to


7
Kulę się. :( Tak więc zwiększyłeś ilość kodu i zmniejszyłeś jego przejrzystość i działasz wolniej, aby pozbyć się ostrzeżenia w edytorze, którego używasz ... Nie używam pycharm, ale zakładam, że jest trochę rodzaj przełącznika konfiguracji, który wyłączy ostrzeżenie i pozwoli ci kontynuować kodowanie w pythonowy sposób. :)
Mac

2
@mac Zgadzam się teraz. Byłem młody i głupi) od tego czasu zmieniłem (trochę) i właśnie wyłączyłem te ostrzeżenia
Igor.K,

Lol! To musi być najbardziej niezapomniany komentarz, jaki kiedykolwiek otrzymałem! ;)
Mac

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

Słownik mógł zostać utworzony bezpośrednio, bez inicjowania ich, a następnie ponownego przypisywania nowych wartości.


0

Mam sytuację, w której to ostrzeżenie mnie denerwuje. W moim przypadku zapełniam mój słownik częściowo literałami, a częściowo z krotki przez funkcję, taką jak:

def get_other_values():
    return 3, 4

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

Tak więc, chyba że utworzę zmienne tymczasowe dla danych wyjściowych get_other_values, PEP8 wygeneruje to ostrzeżenie, mimo że tworzę dykt z literałami. I nie mogę przypisać klawiszy cid do literału, ponieważ wartości są wyprowadzane jako krotka.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.