# Narrowing for `in` conditionals ## `in` for tuples ```py def _(x: int): if x in (1, 2, 3): reveal_type(x) # revealed: int else: reveal_type(x) # revealed: int ``` ```py def _(x: str): if x in ("a", "b", "c"): reveal_type(x) # revealed: str else: reveal_type(x) # revealed: str ``` ```py from typing import Literal def _(x: Literal[1, 2, "a", "b", False, b"abc"]): if x in (1,): reveal_type(x) # revealed: Literal[1] elif x in (2, "a"): reveal_type(x) # revealed: Literal[2, "a"] elif x in (b"abc",): reveal_type(x) # revealed: Literal[b"abc"] elif x not in (3,): reveal_type(x) # revealed: Literal["b", False] else: reveal_type(x) # revealed: Never ``` ```py def _(x: Literal["a", "b", "c", 1]): if x in ("a", "b", "c", 2): reveal_type(x) # revealed: Literal["a", "b", "c"] else: reveal_type(x) # revealed: Literal[1] ``` ## `in` for `str` and literal strings ```py def _(x: str): if x in "abc": reveal_type(x) # revealed: str else: reveal_type(x) # revealed: str ``` ```py from typing import Literal def _(x: Literal["a", "b", "c", "d"]): if x in "abc": reveal_type(x) # revealed: Literal["a", "b", "c"] else: reveal_type(x) # revealed: Literal["d"] ``` ```py def _(x: Literal["a", "b", "c", "e"]): if x in "abcd": reveal_type(x) # revealed: Literal["a", "b", "c"] else: reveal_type(x) # revealed: Literal["e"] ``` ```py def _(x: Literal[1, "a", "b", "c", "d"]): # error: [unsupported-operator] if x in "abc": reveal_type(x) # revealed: Literal["a", "b", "c"] else: reveal_type(x) # revealed: Literal[1, "d"] ``` ## Assignment expressions ```py from typing import Literal def f() -> Literal[1, 2, 3]: return 1 if (x := f()) in (1,): reveal_type(x) # revealed: Literal[1] else: reveal_type(x) # revealed: Literal[2, 3] ```