Quiero usar la coincidencia de patrones estructurales de Python para distinguir entre una tupla (por ejemplo, que representa un punto) y una lista de tuplas.
Sin embargo, el enfoque directo no funciona:
def fn(p): match p: case (x, y): print(f"single point: ({x}, {y})") case [*points]: print("list of points:") for x, y in points: print(f"({x}, {y})") fn((1, 1)) fn([(1, 1), (2, 2)])que salidas:
single point: (1, 1) single point: ((1, 1), (2, 2))mientras que quiero que salga:
single point: (1, 1) list of points: (1, 1) (2, 2)Cambiar el orden de las declaraciones de caso tampoco ayuda aquí.
¿Cuál es una buena manera de resolver esto con la coincidencia de patrones?
Use tuple(foo) para hacer coincidir una tupla y list(foo) para hacer coincidir una lista
def fn(p): match p: case tuple(contents): print(f"tuple: {contents}") case list(contents): print(f"list: {contents}") fn((1, 1)) # tuple: (1, 1) fn([(1, 1), (2, 2)]) # list: [(1, 1), (2, 2)]