Por que o inspetor de Pycharm se queixa de "d = {}"?

195

Ao inicializar um dicionário com d = {}o inspetor de código do Pycharm, gera um aviso, dizendo

Essa criação do dicionário pode ser reescrita como um literal do dicionário.

Se eu reescrevê-lo, d = dict()o aviso desaparece. Como {}é um literal de dicionário, tenho certeza de que a mensagem está incorreta. Além disso, parece que tanto d = {}e d = dict()são válidos e Pythonic.

Essa questão relacionada parece concluir que a escolha é apenas uma questão de estilo / preferência: diferenças entre "d = dict ()" e "d = {}"

Por que Pycharm reclamaria d = {}?

ATUALIZAR:

Mac acertou em cheio. O aviso realmente se aplicou a várias linhas, não apenas à que foi sinalizada.

O Pycharm parece procurar uma sequência de instruções consecutivas onde você inicializa um dicionário e, em seguida, define valores no dicionário. Por exemplo, isso acionará o aviso:

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

Mas este código não irá:

d = {}
pass
d['a'] = 1
Chris Sears
fonte
2
muito barulhento, e não há nenhum ganho de desempenho real, apenas uma inspecção mais supérfluo
dashesy
O mesmo acontece com as listas: a = [1]; a.append (2), provavelmente porque a = [1, 2] é mais agradáveis ....
cleros
Sim. mensagem irritante. todos esses sublinhados do PyCharm deixam a pessoa desconfortável antes de executar o programa.
Rajkumar R
Encontrei um problema semelhante no JetBrains YouTrack - youtrack.jetbrains.com/issue/PY-19269#u=1461253420326 e ele diz: Nesse caso, o PyCharm sugere que você pode fornecer o valor do something atributo diretamente no literal do dict em vez de atribuí-lo na próxima linha.
Dudnikof

Respostas:

244

Qual é o código a seguir na sua declaração de dicionário?

Acho pycharm irá disparar o erro se você tiver algo como:

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

como você poderia ter escrito

dic = {'aaa': 5}

BTW: O fato de o erro desaparecer se você usar a função não significa necessariamente que o pycharm acredite dict()ser literal. Isso pode significar apenas que não se queixa de:

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

HTH!

Mac
fonte
6
aparentemente, é para todas essas inspeções barulhentas inúteis, infelizmente, alguns dos meus colegas desligam-na completamente, é uma pena, porque é útil para muitas coisas como PEP, ..., problemas reais e dicas de desempenho reais.
dashesy
No meu caso, esse tipo de reescrita não é possível, pois cada item de dicionário criado (mas o primeiro) depende do item de dicionário anterior criado. Portanto, eles devem ser atribuídos ao dicionário um por um, em vez de todos os itens ao mesmo tempo. No entanto, o PyCharm ainda reclama e diz que devo criar o dicionário como um literal de dicionário. Eu acho que tenho que usar a dic = dict()solução alternativa ...
HelloGoodbye
@HelloGoodbye - Sem saber o problema que você está tentando resolver, não posso expressar uma opinião qualificada, mas você já pensou em começar com d = { 'aaa': f1(something) }isso d = f2(d)então d = f3(d)etc ... Ou d['bbb'] = f2(d), alternativamente , d['ccc'] = f3(d)...?
mac
A construção que eu tenho é d = {}, d['a'] = A, d['b'] = f(d['a']), d['c'] = f(d['b']), etc.
hellogoodbye
5
@ HelloGoodbye - Então, por que não mesclar os dois primeiros d = {'a': A}e depois manter a sequência como você descreveu?
mac
15

Isso pode ser desativado nas configurações do projeto ou nas configurações padrão.

  • Navegue para Configurações -> Inspeções -> Python
  • Desmarque "A criação do dicionário pode ser reescrita pelo literal do dicionário"
Craig Jackson
fonte
Foi o que fiz e posso confirmar que funciona bem. Meu código era: payload = {** BASEPAYLOAD, ** ExtraPayload} para mesclar dois dicionários e estava lançando o erro.
pa1983
9

para quem gosta (como eu) de inicializar dicionários com uma única operação

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

em vez de muitas linhas como

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

no final, acabei com isso:

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

Pycharm não está reclamando disso

Igor.K
fonte
7
Eu me encolho. :( Então, você realmente aumentou a quantidade de código e tornou menos claro e lento, apenas para se livrar de um aviso no editor que você usa ... Eu não uso o pycharm, mas suponho que exista algum tipo de alternância de configuração que desabilitará o aviso e permitirá que você continue codificando de forma pitônica. :)
mac
2
@mac eu concordo agora. Eu era jovem e estúpido) desde então, mudei (um pouco) e apenas desabilitei esses avisos
Igor
Ri muito! Esse deve ser o comentário de tempo mais memorável que já recebi! ;)
mac
0
mydict = {
  a: 5,
  b:z+c/2
}

O dicionário poderia ter sido criado diretamente, sem inicializá-los primeiro e depois reatribuir novos valores.

Asnim P Ansari
fonte
0

Eu tenho uma situação em que esse aviso está me incomodando demais. No meu caso, estou preenchendo meu ditado parcialmente como literais e parcialmente de uma saída de tupla por uma função, da seguinte forma:

def get_other_values():
    return 3, 4

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

Portanto, a menos que eu crie vars intermediários para a saída de get_other_values, o PEP8 gera esse aviso, mesmo que eu esteja criando o dict com literais. E não posso atribuir as teclas c e d no literal, pois os valores são emitidos como uma tupla.

Chris Woodfield
fonte