The remaining significant false positive cases are where:
- the capturing function is only used in the same iteration as the values it was intended to capture. For example, in
for x in xs:
print map(lambda y: x+y, ys)
the use of each lambda is only in the same iteration as the x it was intended to capture (and map does not retain the function), so there is no bug.
- the captured variables are only assigned once, before any application of a capturing function. A somewhat artificial example:
fs = []
z = None
for x in range(2):
if z is None:
z = 42
fs.append(lambda y: y+z)
because the captured z is effectively constant, even though it is assigned in the loop.
Both these cases are undecidable to detect in general. You could detect special cases of the first, such as builtin map or filter with a lambda expression as its first argument, but it's probably not worth the complication.
After applying the patches on #1556, Tahoe produces no warnings from make check-miscaptures, so I'd like to include that in the buildbot flow in the same way as pyflakes. (It would be ok to run it in the same step as pyflakes.)