在我的代码中,我需要区分记录列表和记录列表列表。现有代码是这样的:
if isinstance(input_var, list):
if len(input_var) > 0:
if all(isinstance(item) for item in input_var):
return list_of_lists_processing(input_var)
elif not any(instance(item, list) for item in input_var):
return list_of_data_processing(input_var)
else:
raise ValueError(f"Unexpected input_var value {input_var}")
else:
return list()
else:
raise ValueError(f"Unexpected input_var value {input_var}")
但是,这看起来很难看。我想使用Python 3.10的模式匹配来简化代码。我想出了这个版本:
match input_var:
case [list(), *_]:
return list_of_lists_processing(input_var)
case list():
# also process empty list case
return list_of_data_processing(input_var)
case _:
ValueError(f"Unexpected value {input_var=}")
但是这里有一个缺陷:
case [*list(), *_]
只检查input_var的第一个元素,而不是全部。实际上,这足以满足我的目的,但无论如何我想问:是否有一种干净的方法来仅匹配每个元素都是列表的列表?
我尝试了
case [*list()]:
,但这会导致SyntaxError
。 case list(list()):
在语法上是正确的,但无法按预期工作(例如,它匹配 ["a"]
- 这是怎么回事?)
没有一种简单的方法可以直接匹配元素是列表的列表。因此,您可以将模式匹配与保护子句结合起来。 试试这个:
match input_var:
# matches lists of lists using a guard clause
case [first_list, *rest_lists] if all(isinstance(item, list) for item in [first_list] + rest_lists):
return list_of_lists_processing(input_var)
case list():
# also process empty list case
return list_of_data_processing(input_var)
# handle other unexpected values
case _:
raise ValueError(f"Unexpected value {input_var}")