Open hauntsaninja opened 2 months ago
Thanks for tagging me!
I'll take a look later this week and see if I can fix it right away, or if it blows up the scope (I doubt the latter one). :slightly_smiling_face:
Hi,
we're seeing complaints for code like
lst: list[dict] = [dic1, ..., dicn]
for dic in lst:
dic["key"] = False
Is this related?
Potentially. I'm actually working on it right now, so I'll also check this.
I've created #469 - the fix was rather easy and simple, just an oversight in the initial implementation :grimacing:
I've ran it on the black code base with the only hit being ./black/src/blib2to3/pgen2/pgen.py:235:21
, which is a true positive considering the comment in line 223 (for state in states: # NB states grows while we're iterating
).
With Project-MONAI, I could also eliminate the cases pointed out, however, there is a discussion point (hence the PR only being a draft):
Should B909 allow altering an element via it's dictionary key? For example:
some_dict = {...}
for key in some_dict:
some_dict[key] = 3
del some_dict[key]
Should this fire B909 or not? What do you think?
cc @cooperlees
Should B909 allow altering an element via it's dictionary key? For example:
some_dict = {...} for key in some_dict: some_dict[key] = 3 del some_dict[key]
I'd argue it should fire due to the del
.
EDIT: The following is incorrect and shouldn't be considered - I leave it here for completeness as it was partially quoted:
However, I'd also argue it shouldn't in such a case:
some_dict = {...}
for key in some_dict.keys(): # this creates a new object that no longer depends on the original
some_dict[key] = 3
del some_dict[key]
this creates a new object that no longer depends on the original
That's not true in Python 3. Your code will throw RuntimeError: dictionary changed size during iteration
.
E.g.
See https://github.com/psf/black/actions/runs/8776854301/job/24081105618?pr=4318 for more
cc @mimre25 in case interested in improving the check :-)