better...

```
if summand.is_Mul:
    out = sift(summand.args, lambda w: w.is_commutative and w.has(*self.variables))
    return C.Mul(*out[True])*self.func(C.Mul(*out[False]), *self.limits)
```