From b1ce8a39495918d1b7421317b8b8e63d0653d3df Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Wed, 30 Oct 2024 12:03:50 -0400 Subject: [PATCH] Use `Never` instead of `None` for stores (#13984) ## Summary See: https://github.com/astral-sh/ruff/pull/13981#issuecomment-2445472433 --- .../resources/mdtest/unpacking.md | 28 +++++++------------ .../src/types/infer.rs | 8 +++--- 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/crates/red_knot_python_semantic/resources/mdtest/unpacking.md b/crates/red_knot_python_semantic/resources/mdtest/unpacking.md index e1ee64721161f..bd89d8311cd01 100644 --- a/crates/red_knot_python_semantic/resources/mdtest/unpacking.md +++ b/crates/red_knot_python_semantic/resources/mdtest/unpacking.md @@ -81,8 +81,7 @@ reveal_type(b) # revealed: Literal[2] ```py # TODO: Add diagnostic (need more values to unpack) -# TODO: Remove 'not-iterable' diagnostic -[a, *b, c, d] = (1, 2) # error: "Object of type `None` is not iterable" +[a, *b, c, d] = (1, 2) reveal_type(a) # revealed: Literal[1] # TODO: Should be list[Any] once support for assigning to starred expression is added reveal_type(b) # revealed: @Todo @@ -93,7 +92,7 @@ reveal_type(d) # revealed: Unknown ### Starred expression (2) ```py -[a, *b, c] = (1, 2) # error: "Object of type `None` is not iterable" +[a, *b, c] = (1, 2) reveal_type(a) # revealed: Literal[1] # TODO: Should be list[Any] once support for assigning to starred expression is added reveal_type(b) # revealed: @Todo @@ -103,8 +102,7 @@ reveal_type(c) # revealed: Literal[2] ### Starred expression (3) ```py -# TODO: Remove 'not-iterable' diagnostic -[a, *b, c] = (1, 2, 3) # error: "Object of type `None` is not iterable" +[a, *b, c] = (1, 2, 3) reveal_type(a) # revealed: Literal[1] # TODO: Should be list[int] once support for assigning to starred expression is added reveal_type(b) # revealed: @Todo @@ -114,8 +112,7 @@ reveal_type(c) # revealed: Literal[3] ### Starred expression (4) ```py -# TODO: Remove 'not-iterable' diagnostic -[a, *b, c, d] = (1, 2, 3, 4, 5, 6) # error: "Object of type `None` is not iterable" +[a, *b, c, d] = (1, 2, 3, 4, 5, 6) reveal_type(a) # revealed: Literal[1] # TODO: Should be list[int] once support for assigning to starred expression is added reveal_type(b) # revealed: @Todo @@ -126,8 +123,7 @@ reveal_type(d) # revealed: Literal[6] ### Starred expression (5) ```py -# TODO: Remove 'not-iterable' diagnostic -[a, b, *c] = (1, 2, 3, 4) # error: "Object of type `None` is not iterable" +[a, b, *c] = (1, 2, 3, 4) reveal_type(a) # revealed: Literal[1] reveal_type(b) # revealed: Literal[2] # TODO: Should be list[int] once support for assigning to starred expression is added @@ -215,8 +211,7 @@ reveal_type(b) # revealed: LiteralString ```py # TODO: Add diagnostic (need more values to unpack) -# TODO: Remove 'not-iterable' diagnostic -(a, *b, c, d) = "ab" # error: "Object of type `None` is not iterable" +(a, *b, c, d) = "ab" reveal_type(a) # revealed: LiteralString # TODO: Should be list[LiteralString] once support for assigning to starred expression is added reveal_type(b) # revealed: @Todo @@ -227,7 +222,7 @@ reveal_type(d) # revealed: Unknown ### Starred expression (2) ```py -(a, *b, c) = "ab" # error: "Object of type `None` is not iterable" +(a, *b, c) = "ab" reveal_type(a) # revealed: LiteralString # TODO: Should be list[Any] once support for assigning to starred expression is added reveal_type(b) # revealed: @Todo @@ -237,8 +232,7 @@ reveal_type(c) # revealed: LiteralString ### Starred expression (3) ```py -# TODO: Remove 'not-iterable' diagnostic -(a, *b, c) = "abc" # error: "Object of type `None` is not iterable" +(a, *b, c) = "abc" reveal_type(a) # revealed: LiteralString # TODO: Should be list[LiteralString] once support for assigning to starred expression is added reveal_type(b) # revealed: @Todo @@ -248,8 +242,7 @@ reveal_type(c) # revealed: LiteralString ### Starred expression (4) ```py -# TODO: Remove 'not-iterable' diagnostic -(a, *b, c, d) = "abcdef" # error: "Object of type `None` is not iterable" +(a, *b, c, d) = "abcdef" reveal_type(a) # revealed: LiteralString # TODO: Should be list[LiteralString] once support for assigning to starred expression is added reveal_type(b) # revealed: @Todo @@ -260,8 +253,7 @@ reveal_type(d) # revealed: LiteralString ### Starred expression (5) ```py -# TODO: Remove 'not-iterable' diagnostic -(a, b, *c) = "abcd" # error: "Object of type `None` is not iterable" +(a, b, *c) = "abcd" reveal_type(a) # revealed: LiteralString reveal_type(b) # revealed: LiteralString # TODO: Should be list[int] once support for assigning to starred expression is added diff --git a/crates/red_knot_python_semantic/src/types/infer.rs b/crates/red_knot_python_semantic/src/types/infer.rs index a8d5e500c3367..f28df4e37f6ca 100644 --- a/crates/red_knot_python_semantic/src/types/infer.rs +++ b/crates/red_knot_python_semantic/src/types/infer.rs @@ -1414,11 +1414,11 @@ impl<'db> TypeInferenceBuilder<'db> { // Resolve the target type, assuming a load context. let target_type = match &**target { Expr::Name(name) => { - self.store_expression_type(target, Type::None); + self.store_expression_type(target, Type::Never); self.infer_name_load(name) } Expr::Attribute(attr) => { - self.store_expression_type(target, Type::None); + self.store_expression_type(target, Type::Never); self.infer_attribute_load(attr) } _ => self.infer_expression(target), @@ -2506,7 +2506,7 @@ impl<'db> TypeInferenceBuilder<'db> { fn infer_name_expression(&mut self, name: &ast::ExprName) -> Type<'db> { match name.ctx { ExprContext::Load => self.infer_name_load(name), - ExprContext::Store | ExprContext::Del => Type::None, + ExprContext::Store | ExprContext::Del => Type::Never, ExprContext::Invalid => Type::Unknown, } } @@ -2536,7 +2536,7 @@ impl<'db> TypeInferenceBuilder<'db> { ExprContext::Load => self.infer_attribute_load(attribute), ExprContext::Store | ExprContext::Del => { self.infer_expression(value); - Type::None + Type::Never } ExprContext::Invalid => { self.infer_expression(value);