ruff/crates/ty_python_semantic/resources/mdtest/call/annotation.md
2025-05-03 19:49:15 +02:00

1.4 KiB

typing.Callable

from typing import Callable

def _(c: Callable[[], int]):
    reveal_type(c())  # revealed: int

def _(c: Callable[[int, str], int]):
    reveal_type(c(1, "a"))  # revealed: int

    # error: [invalid-argument-type] "Argument to this function is incorrect: Expected `int`, found `Literal["a"]`"
    # error: [invalid-argument-type] "Argument to this function is incorrect: Expected `str`, found `Literal[1]`"
    reveal_type(c("a", 1))  # revealed: int

The Callable annotation can only be used to describe positional-only parameters.

def _(c: Callable[[int, str], None]):
    # error: [unknown-argument] "Argument `a` does not match any known parameter"
    # error: [unknown-argument] "Argument `b` does not match any known parameter"
    # error: [missing-argument] "No arguments provided for required parameters 1, 2"
    reveal_type(c(a=1, b="b"))  # revealed: None

If the annotation uses a gradual form (...) for the parameter list, then it can accept any kind of parameter with any type.

def _(c: Callable[..., int]):
    reveal_type(c())  # revealed: int
    reveal_type(c(1))  # revealed: int
    reveal_type(c(1, "str", False, a=[1, 2], b=(3, 4)))  # revealed: int

An invalid Callable form can accept any parameters and will return Unknown.

# error: [invalid-type-form]
def _(c: Callable[42, str]):
    reveal_type(c())  # revealed: Unknown