Perché l'ispettore di Pycharm si lamenta di "d = {}"?


196

Quando si inizializza un dizionario con la d = {}finestra di ispezione del codice di Pycharm, viene generato un avviso

Questa creazione del dizionario potrebbe essere riscritta come un dizionario letterale.

Se lo riscrivo d = dict()l'avviso scompare. Dato che è{} già un dizionario letterale, sono abbastanza sicuro che il messaggio sia errato. Inoltre, sembrano entrambi e sono validi e Pythonic.d = {}d = dict()

Questa domanda correlata sembra concludere che la scelta è solo una questione di stile / preferenza: differenze tra "d = dict ()" e "d = {}"

Perché Pycharm si lamenterebbe d = {}?

AGGIORNARE:

Mac l'ha inchiodato. L'avvertimento si applicava effettivamente a più righe, non solo a quella contrassegnata.

Pycharm sembra cercare una sequenza di istruzioni consecutive in cui si inizializza un dizionario e quindi si impostano i valori nel dizionario. Ad esempio, questo attiverà l'avvertimento:

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

Ma questo codice non:

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

2
troppo rumoroso, e non c'è un reale guadagno in termini di prestazioni, solo un'altra ispezione superflua
frettolosamente

La stessa cosa accade per le liste: a = [1]; a.append (2), probabilmente perché a = [1, 2] è più bello ....
cleros

Sì. messaggio fastidioso. tutte quelle sottolineate da PyCharm mettono a disagio prima di eseguire il programma.
Rajkumar R,

Ho riscontrato un problema simile in JetBrains YouTrack - youtrack.jetbrains.com/issue/PY-19269#u=1461253420326 e dice: In questo caso PyCharm suggerisce che puoi fornire il valore something dell'attributo nel letterale dict invece di assegnarlo alla riga successiva.
Dudnikof,

Risposte:


245

Qual è il seguente codice per la dichiarazione del dizionario?

Penso che Pycharm causerà l'errore se hai qualcosa del tipo:

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

come avresti potuto scrivere

dic = {'aaa': 5}

A proposito: il fatto che l'errore scompaia se si utilizza la funzione non significa necessariamente che Pycharm creda che dict()sia letterale. Potrebbe semplicemente significare che non si lamenta per:

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

HTH!


6
a quanto pare è per tutte queste ispezioni rumorose non utili purtroppo alcuni dei miei colleghi lo disattivano del tutto, è un peccato perché è utile per molte cose come PEP, ..., problemi reali e suggerimenti di prestazioni reali.
breve

Nel mio caso quel tipo di riscrittura non è possibile, poiché ogni elemento del dizionario che viene creato (ma il primo) dipende dal precedente elemento del dizionario creato. Quindi devono essere assegnati al dizionario uno per uno anziché ogni elemento contemporaneamente. Tuttavia, PyCharm si lamenta ancora e dice che dovrei creare il dizionario come un dizionario letterale. Immagino di dover usare la dic = dict()soluzione alternativa ...
Ciao Arrivederci

@HelloGoodbye - Senza conoscere il problema che stai cercando di risolvere, non posso esprimere un'opinione qualificata, ma hai preso in considerazione di iniziare da d = { 'aaa': f1(something) }allora d = f2(d)quindi d = f3(d)ecc ... O in alternativa d['bbb'] = f2(d), d['ccc'] = f3(d)...?
mac,

La costruzione che ho è d = {}, d['a'] = A, d['b'] = f(d['a']), d['c'] = f(d['b']), ecc
HelloGoodbye

5
@HelloGoodbye - Quindi, perché non unire i primi due d = {'a': A}e poi mantenere la sequenza come hai delineato?
mac,

16

Questo può essere disabilitato in Impostazioni progetto o Impostazioni predefinite.

  • Passa a Impostazioni -> Ispezioni -> Python
  • Deseleziona "La creazione del dizionario potrebbe essere riscritta dal dizionario letterale"

Questo è quello che ho fatto e posso confermare che funziona bene. Il mio codice era: payload = {** BASEPAYLOAD, ** ExtraPayload} per unire due dizionari e stava generando l'errore.
pa1983,

9

per coloro a cui piace (proprio come me) inizializzare i dizionari con un'unica operazione

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

invece di molte righe come

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

alla fine ho finito con questo:

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

Pycharm non si lamenta di questo


7
Io rabbrividisco. :( Quindi, in realtà hai aumentato la quantità di codice e lo hai reso meno chiaro e più lento solo per sbarazzarti di un avviso nell'editor che ti capita di usare ... Non uso pycharm, ma suppongo che ci sia un po ' una sorta di interruttore di configurazione che disabiliterà l'avvertimento e ti permetterà di continuare a scrivere codice in modo pitonico. :)
mac

2
@mac Sono d'accordo ora. Sono stato giovane e stupido) da allora ho cambiato (un po ') e ho semplicemente disabilitato quegli avvisi
Igor.K

Lol! Questo deve essere il commento più memorabile che ho mai ricevuto! ;)
mac

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

Il dizionario avrebbe potuto essere creato direttamente senza prima inizializzarli e quindi riassegnare nuovi valori.


0

Ho una situazione in cui questo avvertimento mi sta scatenando. Nel mio caso, sto popolando il mio dict in parte come valori letterali e in parte da una tupla prodotta da una funzione, in questo modo:

def get_other_values():
    return 3, 4

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

Quindi, a meno che non crei var intermedi per l'output di get_other_values, PEP8 genera questo avviso anche se sto creando il dict con valori letterali. E non posso assegnare i tasti c e d in valore letterale, poiché i valori vengono emessi come tupla.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.