Skip to content

Commit

Permalink
Use Never instead of None for stores (#13984)
Browse files Browse the repository at this point in the history
## Summary

See:
#13981 (comment)
  • Loading branch information
charliermarsh authored Oct 30, 2024
1 parent 262c04f commit b1ce8a3
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 22 deletions.
28 changes: 10 additions & 18 deletions crates/red_knot_python_semantic/resources/mdtest/unpacking.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down
8 changes: 4 additions & 4 deletions crates/red_knot_python_semantic/src/types/infer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down Expand Up @@ -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,
}
}
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit b1ce8a3

Please sign in to comment.