In Mathematica, you might do this as (roughly): rules = { {x_, y_, z_} :> {x, y, z}, {x_, y_} :> {x, y, 0.0}, x_ :> {x, 0.0, 0.0} } process[Replace[obj, rules]] Whatever you think of the particular syntax: The ability to declare resuable rules seems good. Thinking of replacement functionally seems good. fwiw, Alan Isaac On 11/17/2020 5:02 AM, Steven D'Aprano wrote:
On Tue, Nov 17, 2020 at 08:49:28AM +0100, Marco Sulla wrote:
PS: pattern matching, for a mere mortal like me, seems to be something very exotical.
Have you ever written code that looks like this?
if isinstance(obj, tuple) and len(obj) ==3: x, y, z = obj elif isinstance(obj, tuple) and len(obj) == 2: x, y = obj z = 0.0 elif isinstance(obj, float): x = obj y = z = 0.0 else: raise ValueError process(x, y, z)
That's pattern matching.
match obj: case x, y, z: pass case x, y: z = 0.0 case x if isinstance(x, float): y = z = 0.0 case _: raise ValueError process(x, y, z)
There may be cleaner or alternative ways to write this as a match statement, I'm still learning pattern matching idioms myself. But in a nutshell, they simplify what would otherwise look like a long, repetitive chain of if, isinstance, sequence unpacking, etc.