Python Forum

Full Version: Mypy typing error
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
    @staticmethod
    def formula_obj_to_string(formula: Formula) -> str:
        """Recursive function to assemble a string representation of the formula described by the
        a Formula object.
        Parameters:
            formula: The Formula object to build the string repr. of.
        Returns:
            A string representing the formula object.
        """
        if is_variable(formula.root) or is_constant(formula.root):
            return formula.root
        return (
            Formula.negate_formula(formula)
            if is_unary(formula.root)
            else Formula.create_binary_formula(
                formula.root, formula.first, formula.second
            )
        )
class Formula:
    """An immutable propositional formula in tree representation, composed from
    atomic propositions, and operators applied to them.
    Attributes:
        root (`str`): the constant, atomic proposition, or operator at the root
            of the formula tree.
        first (`~typing.Optional`\\[`Formula`]): the first operand to the root,
            if the root is a unary or binary operator.
        second (`~typing.Optional`\\[`Formula`]): the second operand to the
            root, if the root is a binary operator.
    """

    root: str
    first: Optional[Formula]
    second: Optional[Formula]
@lru_cache(maxsize=100)  # Cache the return value of is_unary
def is_unary(string: str) -> bool:
    """Checks if the given string is a unary operator.
    Parameters:
        string: string to check.
    Returns:
        ``True`` if the given string is a unary operator, ``False`` otherwise.
    """
    return string == "~"
Mypy gives me an error: Argument 1 to "formula_obj_to_string" of "Formula" has incompatible type "Optional[Formula]"; expected "Formula"
But in this case, I know that according to the conditions that the argument formula.first will be of type Formula. How can I type-assert it here so that Mypy won't yell on that?

Thanks in advance!
when posting errors, please, always post the entire, unaltered error traceback as it contains valuable diagnostic information.
(Sep-04-2021, 10:08 PM)Larz60+ Wrote: [ -> ]when posting errors, please, always post the entire, unaltered error traceback as it contains valuable diagnostic information.

Error:
{ "resource": "~/Intro to Logic/Projects/propositions/syntax.py", "owner": "python", "code": "error", "severity": 8, "message": "Argument 1 to \"formula_obj_to_string\" of \"Formula\" has incompatible type \"Optional[Formula]\"; expected \"Formula\"", "source": "mypy", "startLineNumber": 134, "startColumn": 61, "endLineNumber": 134, "endColumn": 61 } { "resource": "~/Intro to Logic/Projects/propositions/syntax.py", "owner": "python", "code": "error", "severity": 8, "message": "Argument 2 to \"create_binary_formula\" of \"Formula\" has incompatible type \"Optional[Formula]\"; expected \"Formula\"", "source": "mypy", "startLineNumber": 175, "startColumn": 31, "endLineNumber": 175, "endColumn": 31 } { "resource": "~/Intro to Logic/Projects/propositions/syntax.py", "owner": "python", "code": "error", "severity": 8, "message": "Argument 3 to \"create_binary_formula\" of \"Formula\" has incompatible type \"Optional[Formula]\"; expected \"Formula\"", "source": "mypy", "startLineNumber": 175, "startColumn": 46, "endLineNumber": 175, "endColumn": 46 }
    @staticmethod
    def negate_formula(formula: Formula) -> str:
        """Negates a formula.

        Parameters:
            formula: A formula to negate.

        Returns:
            A string reresenting the formula negated.
        """
        return formula.root + Formula.formula_obj_to_string(formula.first)
    @staticmethod
    def create_binary_formula(
        binary_operator: str, first_sub_formula: Formula, second_sub_formula: Formula
    ) -> str:
        """Assmebles a binary formula out of two sub-formulas.

        Parameters:
            binary_operator: The binary operator applied on the two sub-formulas.
            first_sub_formula: The first sub-formula.
            second_sub_formula: The second sub-formula.

        Returns:
            A string reresenting the suitable binary formula.
        """
        return (
            OPEN_BINARY_FORM
            + Formula.formula_obj_to_string(first_sub_formula)
            + binary_operator
            + Formula.formula_obj_to_string(second_sub_formula)
            + CLOSE_BINARY_FORM
        )
This is all the related stuff.