es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for 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:

    match node:
        case Var(x):
            return x
        case Val(i):
            return str(i)
        case Op(operation, left_operand, right_operand):
            if isinstance(left_operand, Node) and isinstance(right_operand, Node):
                return "(" + node_to_str(left_operand) + " " + operation + " " + node_to_str(right_operand) + ")"
            else:
                raise ValueError("Los operandos izquierdo y derecho deben ser del tipo Node.")
    

    En este código actualizado, hemos definido dos variables left_operand y right_operand para representar los operandos izquierdo y derecho respectivamente. Luego comprobamos si estas variables son instancias del tipo Node y, si es así, procedemos a formar la representación de cadena. Si no lo son, lanzamos un ValueError indicando que los operandos deben ser del tipo Node.

Comments are closed.