code: def is_causal(self):
      
      return all(filt.is_causal() for filt in self.callables
                                  if hasattr(filt, "is_causal"))
docs: Tests whether all filters in the list are causal (i.e., no future-data
      delay in positive ``z`` exponents). Non-linear filters are seem as causal
      by default. CascadeFilter and ParallelFilter are causal if all the
      filters they group are causal.