假设我有以下功能:
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
语句尝试这个逻辑,你必须首先捕获元素并使用匹配守卫来验证条件,但在这种情况下这是一种复杂/不可读的解决方案。
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")
另请参阅:
您可以使用递归而不是对序列进行两次迭代。
numbers = [1, 2, 3.0]
ints = [1, 2, 3]
def sum_ints(l: list[int]) -> int:
match l:
case [int()]:
return l[0]
case [int(), *_]:
return l[0] + sum_ints(l[1:])
case [x, *_]:
raise ValueError(f'{x} is {type(x)}')
print(sum_ints(ints))
try:
print(sum_ints(numbers))
except ValueError as e:
print(e)
但是由于 python 是鸭子类型的,有些人可能会质疑为什么人们会关心一个元素是否是
int
、float
或其他什么。