Python 3.10 中未知长度列表的结构模式匹配
Structural pattern matching for list of unknown length in Python 3.10
假设我有以下功能:
def sum_ints(my_list: list[int]) -> int:
return sum(my_list)
在我开始在 my_list
中添加元素之前,我想使用新的 match
语句检查所有元素的类型。
如果 my_list
的长度为 2,我可以这样做:
def sum_ints(my_list: list[int]) -> int:
match my_list:
case [int(), int()]:
return sum(my_list)
case _:
raise Exception("...")
如何匹配包含 n
个元素的列表的大小写?
我认为在你的情况下你只需要 all
内置函数。
if all(isinstance(i, int) for i in my_list):
# Do Something
else:
# raise Exception("...")
但是如果你真的想通过match
语句来尝试这个逻辑你必须先捕获元素然后使用match guard 来验证条件,但在这种情况下它是一种 complicated/unreadable 解决方案。
a = [1, 2]
match a:
case [*elements] if all(isinstance(i, int) for i in elements):
print("All elements are int")
case _:
raise Exception("Elements are not int")
另请参阅:
假设我有以下功能:
def sum_ints(my_list: list[int]) -> int:
return sum(my_list)
在我开始在 my_list
中添加元素之前,我想使用新的 match
语句检查所有元素的类型。
如果 my_list
的长度为 2,我可以这样做:
def sum_ints(my_list: list[int]) -> int:
match my_list:
case [int(), int()]:
return sum(my_list)
case _:
raise Exception("...")
如何匹配包含 n
个元素的列表的大小写?
我认为在你的情况下你只需要 all
内置函数。
if all(isinstance(i, int) for i in my_list):
# Do Something
else:
# raise Exception("...")
但是如果你真的想通过match
语句来尝试这个逻辑你必须先捕获元素然后使用match guard 来验证条件,但在这种情况下它是一种 complicated/unreadable 解决方案。
a = [1, 2]
match a:
case [*elements] if all(isinstance(i, int) for i in elements):
print("All elements are int")
case _:
raise Exception("Elements are not int")
另请参阅: