I couldn't find any information on whether this was considered and rejected during the pattern matching PEP, so apologies if this is already settled.

I've just encountered this use-case repeatedly so I figured it was time to make a thread on this.

Basically, I'd like to be able to designate a pattern like this:

match val:
case [*str()]:
...

Where 'val' will match an iterable containing zero or more strings.

This should also work with more complex sub-patterns, like:

match humans:
case [
*{
'name': str(),
'age': int(),
}
]:
...

Where 'humans' should match an iterable of zero or more mappings where each mapping contains the keys 'name' and 'age' (and where the value for name is a string and the value for age is an int).

Sure, you can use the sentinel clause to do it, but imagine you've got a case statement where you're using 10 different variadic sub-patterns. You'd have an unbearably long string of:

case {PATTERN_GOES_HERE} if (
all(isinstance(val1, some_type1) for val1 in sub_pattern1)
and all(isinstance(val2, some_type2) for val2 in sub_pattern2)
and ...
)
And that's assuming simple variadics like my first example above, and not my second example!

This incidentally destroys the gain in legibility of using a pattern in the first place.

Is anyone aware of a reason variadic patterns weren't included in the PEP? Was it an oversight, or was it deemed too niche to include in the original spec? Or were there implementation-related reasons? Something else?

It just seems like it would make match statements way more powerful for data shape validation, which is one of the primary use-cases that the tutorial PEP showed off.

Cheers