This is an interesting point, and one of the deeper "gotchas" of Python and of deploying "seems to work" code in production.  So some consistent way of handling this might be good.  I think that the `contextlib.closing` context manager could help here, as long as you're in a statement context:

```
with closing(genfunction()) as gen:
  for thing in gen:
```

Alternately, you could register each iterable that you want to ensure gets closed in an object, and then use that object with a context manager to ensure the close occurs:

```
closables = Closables()
with closing(closables):
  x = [fn(a, b) for a in closables.add(some_iter) for b in closables.add(another_iter)]
```

Anyway, I think this is an interesting and important case to address.