ruff/crates/red_knot_python_semantic/resources/mdtest/expression/if.md
Shaygan Hooshyari 557d583e32
Support typing.NoReturn and typing.Never (#14559)
Fix #14558 
## Summary

- Add `typing.NoReturn` and `typing.Never` to known instances and infer
them as `Type::Never`
- Add `is_assignable_to` cases for `Type::Never`

I skipped emitting diagnostic for when a function is annotated as
`NoReturn` but it actually returns.

## Test Plan

Added tests from

https://github.com/python/typing/blob/main/conformance/tests/specialtypes_never.py
except from generics and checking if the return value of the function
and the annotations match.

---------

Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
Co-authored-by: Carl Meyer <carl@astral.sh>
2024-11-25 21:37:55 +00:00

1 KiB

If expression

Union

def bool_instance() -> bool:
    return True

reveal_type(1 if bool_instance() else 2)  # revealed: Literal[1, 2]

Statically known branches

reveal_type(1 if True else 2)  # revealed: Literal[1]
reveal_type(1 if "not empty" else 2)  # revealed: Literal[1]
reveal_type(1 if (1,) else 2)  # revealed: Literal[1]
reveal_type(1 if 1 else 2)  # revealed: Literal[1]

reveal_type(1 if False else 2)  # revealed: Literal[2]
reveal_type(1 if None else 2)  # revealed: Literal[2]
reveal_type(1 if "" else 2)  # revealed: Literal[2]
reveal_type(1 if 0 else 2)  # revealed: Literal[2]

Leaked Narrowing Constraint

(issue #14588)

The test inside an if expression should not affect code outside of the expression.

def bool_instance() -> bool:
    return True

x: Literal[42, "hello"] = 42 if bool_instance() else "hello"

reveal_type(x)  # revealed: Literal[42] | Literal["hello"]

_ = ... if isinstance(x, str) else ...

reveal_type(x)  # revealed: Literal[42] | Literal["hello"]