code: def feature_union(names, steps, weights):
      
      steps, times = zip(*map(_maybe_timed, steps))
      fit_time = sum(times)
      if any(s is FIT_FAILURE for s in steps):
          fit_est = FIT_FAILURE
      else:
          fit_est = FeatureUnion(list(zip(names, steps)), transformer_weights=weights)
      return fit_est, fit_time
docs: Reconstruct a FeatureUnion from names, steps, and weights