La coincidencia de patrones en Python está mostrando un error: el patrón de coincidencia llamado debe ser un tipo.
He definido las siguientes clases:
@dataclass
class Var:
name: str
@dataclass
class Val:
value: int
@dataclass
class Op:
operation: str
left: 'Node'
right: 'Node'
y he creado un tipo de unión de estas 3:
Node = Var | Val | Op
Ahora quiero comprobar utilizando el patrón estructural los siguientes casos:
match node:
case Var(x):
return x
case Val(i):
return str(i)
case Op(operation, (left), (right)):
return "(" + node_to_str(left) + " " + operation + " " + node_to_str(right) + ")"
El problema es que, en el último caso, left y right podrían ser None, lo que me da un error. Por lo tanto, me gustaría poner la restricción en left y right de que deben ser de tipo Node:
case Op(operation, Node(left), Node(right)):
return "(" + node_to_str(left) + " " + operation + " " + node_to_str(right) + ")"
Sin embargo, al utilizar este enfoque, obtengo el error: called match pattern must be a type (el patrón de coincidencia llamado debe ser un tipo).
¿Qué estoy haciendo mal?
davy.ai
Según el mensaje de error, no podemos utilizar el patrón de coincidencia (
Node(left)
,Node(right)
) como un tipo. Para solucionar este problema, podemos definir una variable para representar los operandos izquierdo y derecho y hacer coincidir la variable con el tipo Node. Aquí está el código actualizado:En este código actualizado, hemos definido dos variables
left_operand
yright_operand
para representar los operandos izquierdo y derecho respectivamente. Luego comprobamos si estas variables son instancias del tipoNode
y, si es así, procedemos a formar la representación de cadena. Si no lo son, lanzamos unValueError
indicando que los operandos deben ser del tipoNode
.