def Product(item):
    if isinstance(item, float):
        item = int(item)
    if isinstance(item, int):
        result = 1
        while item:
            result *= item % 10
            item //= 10
        return result
    if isinstance(item, Expression):
        item = item.run()
    if isinstance(item, String):
        item = str(item)
    if isinstance(item, str):
        if all(c in "0123456789." for c in item) and item.count(".") < 2:
            return product([0 if c == "." else int(c) for c in item])
        return product(
            float(c) if "." in c else int(c)
            for c in re.findall("\d+\.?\d*|\.\d+", item)
        )
    if hasattr(item, "__iter__") and item:
        if isinstance(item[0], Expression):
            item = iter_apply(item, lambda o: o.run())
        # TODO: cartesian product?
        # if isinstance(item[0], list):
        #     return sum(item, [])
        return product(item)