diff --git a/crates/red_knot_python_semantic/resources/mdtest/annotations/callable.md b/crates/red_knot_python_semantic/resources/mdtest/annotations/callable.md index b84bfe41a54bce..8ca50c5b692c2d 100644 --- a/crates/red_knot_python_semantic/resources/mdtest/annotations/callable.md +++ b/crates/red_knot_python_semantic/resources/mdtest/annotations/callable.md @@ -152,6 +152,21 @@ def _(c: Callable[[int, str], int]): reveal_type(c) # revealed: (int, str, /) -> int ``` +## Union + +```py +from typing import Callable, Union + +def _( + c: Callable[[Union[int, str]], int] | None, + d: None | Callable[[Union[int, str]], int], + e: None | Callable[[Union[int, str]], int] | int, +): + reveal_type(c) # revealed: ((int | str, /) -> int) | None + reveal_type(d) # revealed: None | ((int | str, /) -> int) + reveal_type(e) # revealed: None | ((int | str, /) -> int) | int +``` + ## Nested A nested `Callable` as one of the parameter types: diff --git a/crates/red_knot_python_semantic/src/types/display.rs b/crates/red_knot_python_semantic/src/types/display.rs index 2411c4e8628904..d99d74e3d6fcc3 100644 --- a/crates/red_knot_python_semantic/src/types/display.rs +++ b/crates/red_knot_python_semantic/src/types/display.rs @@ -292,7 +292,14 @@ impl Display for DisplayUnionType<'_> { db: self.db, }); } else { - join.entry(&element.display(self.db)); + if let Type::Callable( + CallableType::General(_) | CallableType::MethodWrapperDunderGet(_), + ) = element + { + join.entry(&format_args!("({})", element.display(self.db))); + } else { + join.entry(&element.display(self.db)); + } } }