code: def _cartesian_product(self, first_specs, second_specs):
          
          return  [ dict(zip(
                            list(s1.keys()) + list(s2.keys()),
                            list(s1.values()) + list(s2.values())
                        ))
                   for s1 in first_specs for s2 in second_specs ]
docs: Takes the Cartesian product of the specifications. Result will
          contain N specifications where N = len(first_specs) *
          len(second_specs) and keys are merged.
          Example: [{'a':1},{'b':2}] * [{'c':3},{'d':4}] =
          [{'a':1,'c':3},{'a':1,'d':4},{'b':2,'c':3},{'b':2,'d':4}]