Why does Pycharm's inspector complain about "d = {}"?
Question:
When initializing a dictionary with d = {}
Pycharm’s code inspector generates a warning, saying
This dictionary creation could be rewritten as a dictionary literal.
If I rewrite it d = dict()
the warning goes away. Since {}
already is a dictionary literal, I’m pretty sure the message is erroneous. Furthermore, it seems like both d = {}
and d = dict()
are valid and Pythonic.
This related question seems to conclude that the choice is just a matter of style/preference:
differences between "d = dict()" and "d = {}"
Why would Pycharm complain about d = {}
?
UPDATE:
Mac nailed it. The warning actually applied to multiple lines, not just the one that was flagged.
Pycharm seems to look for a sequence of consecutive statements where you initialize a dictionary and then set values in the dictionary. For example, this will trigger the warning:
d = {}
d['a'] = 1
But this code will not:
d = {}
pass
d['a'] = 1
Answers:
What is the code following your dictionary declaration?
I think PyCharm will trigger the error if you have something like:
dic = {}
dic['aaa'] = 5
as you could have written
dic = {'aaa': 5}
Note: The fact that the error goes away if you use the function dict()
. This doesn’t necessarily mean that pycharm believes dict()
is a literal. It could just mean that it doesn’t complain about it:
dic = dict()
dic['aaa'] = 5
for those who like (just like me) to initialize dictionaries with single operation
d = {
'a': 12,
'b': 'foo',
'c': 'bar'
}
instead of many lines like
d = dict()
d['a'] = 12
d['b'] = ....
in the end I ended up with this:
d = dict()
d.update({
'a': 12,
'b': 'foo',
'c': 'bar'
})
Pycharm is not complaining on this
This can be disabled in the Project Settings or Default Settings.
- Navigate to Settings -> Inspections -> Python
- Uncheck “Dictionary creation could be rewritten by dictionary literal”
mydict = {
a: 5,
b:z+c/2
}
The dictionary could have been created directly without initialising them first and then reassigning new values.
I have a situation where this warning is bugging the hell out of me. In my case, I’m populating my dict partially as literals and partially from a tuple output by a function, like so:
def get_other_values():
return 3, 4
foo = {
"a": 1,
"b": 2
}
foo["c"], foo["d"] = get_other_values()
So, unless I create interim vars for the output of get_other_values, PEP8 generates this warning even though I’m creating the dict with literals. And I can’t assign the c and d keys in the literal, since the values are output as a tuple.
When initializing a dictionary with d = {}
Pycharm’s code inspector generates a warning, saying
This dictionary creation could be rewritten as a dictionary literal.
If I rewrite it d = dict()
the warning goes away. Since {}
already is a dictionary literal, I’m pretty sure the message is erroneous. Furthermore, it seems like both d = {}
and d = dict()
are valid and Pythonic.
This related question seems to conclude that the choice is just a matter of style/preference:
differences between "d = dict()" and "d = {}"
Why would Pycharm complain about d = {}
?
UPDATE:
Mac nailed it. The warning actually applied to multiple lines, not just the one that was flagged.
Pycharm seems to look for a sequence of consecutive statements where you initialize a dictionary and then set values in the dictionary. For example, this will trigger the warning:
d = {}
d['a'] = 1
But this code will not:
d = {}
pass
d['a'] = 1
What is the code following your dictionary declaration?
I think PyCharm will trigger the error if you have something like:
dic = {}
dic['aaa'] = 5
as you could have written
dic = {'aaa': 5}
Note: The fact that the error goes away if you use the function dict()
. This doesn’t necessarily mean that pycharm believes dict()
is a literal. It could just mean that it doesn’t complain about it:
dic = dict()
dic['aaa'] = 5
for those who like (just like me) to initialize dictionaries with single operation
d = {
'a': 12,
'b': 'foo',
'c': 'bar'
}
instead of many lines like
d = dict()
d['a'] = 12
d['b'] = ....
in the end I ended up with this:
d = dict()
d.update({
'a': 12,
'b': 'foo',
'c': 'bar'
})
Pycharm is not complaining on this
This can be disabled in the Project Settings or Default Settings.
- Navigate to Settings -> Inspections -> Python
- Uncheck “Dictionary creation could be rewritten by dictionary literal”
mydict = {
a: 5,
b:z+c/2
}
The dictionary could have been created directly without initialising them first and then reassigning new values.
I have a situation where this warning is bugging the hell out of me. In my case, I’m populating my dict partially as literals and partially from a tuple output by a function, like so:
def get_other_values():
return 3, 4
foo = {
"a": 1,
"b": 2
}
foo["c"], foo["d"] = get_other_values()
So, unless I create interim vars for the output of get_other_values, PEP8 generates this warning even though I’m creating the dict with literals. And I can’t assign the c and d keys in the literal, since the values are output as a tuple.