Use Never instead of None for stores (#13984)

## Summary

See:
https://github.com/astral-sh/ruff/pull/13981#issuecomment-2445472433
This commit is contained in:
Charlie Marsh 2024-10-30 12:03:50 -04:00 committed by GitHub
parent 262c04f297
commit b1ce8a3949
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 14 additions and 22 deletions

View file

@ -81,8 +81,7 @@ reveal_type(b) # revealed: Literal[2]
```py ```py
# TODO: Add diagnostic (need more values to unpack) # TODO: Add diagnostic (need more values to unpack)
# TODO: Remove 'not-iterable' diagnostic [a, *b, c, d] = (1, 2)
[a, *b, c, d] = (1, 2) # error: "Object of type `None` is not iterable"
reveal_type(a) # revealed: Literal[1] reveal_type(a) # revealed: Literal[1]
# TODO: Should be list[Any] once support for assigning to starred expression is added # TODO: Should be list[Any] once support for assigning to starred expression is added
reveal_type(b) # revealed: @Todo reveal_type(b) # revealed: @Todo
@ -93,7 +92,7 @@ reveal_type(d) # revealed: Unknown
### Starred expression (2) ### Starred expression (2)
```py ```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] reveal_type(a) # revealed: Literal[1]
# TODO: Should be list[Any] once support for assigning to starred expression is added # TODO: Should be list[Any] once support for assigning to starred expression is added
reveal_type(b) # revealed: @Todo reveal_type(b) # revealed: @Todo
@ -103,8 +102,7 @@ reveal_type(c) # revealed: Literal[2]
### Starred expression (3) ### Starred expression (3)
```py ```py
# TODO: Remove 'not-iterable' diagnostic [a, *b, c] = (1, 2, 3)
[a, *b, c] = (1, 2, 3) # error: "Object of type `None` is not iterable"
reveal_type(a) # revealed: Literal[1] reveal_type(a) # revealed: Literal[1]
# TODO: Should be list[int] once support for assigning to starred expression is added # TODO: Should be list[int] once support for assigning to starred expression is added
reveal_type(b) # revealed: @Todo reveal_type(b) # revealed: @Todo
@ -114,8 +112,7 @@ reveal_type(c) # revealed: Literal[3]
### Starred expression (4) ### Starred expression (4)
```py ```py
# TODO: Remove 'not-iterable' diagnostic [a, *b, c, d] = (1, 2, 3, 4, 5, 6)
[a, *b, c, d] = (1, 2, 3, 4, 5, 6) # error: "Object of type `None` is not iterable"
reveal_type(a) # revealed: Literal[1] reveal_type(a) # revealed: Literal[1]
# TODO: Should be list[int] once support for assigning to starred expression is added # TODO: Should be list[int] once support for assigning to starred expression is added
reveal_type(b) # revealed: @Todo reveal_type(b) # revealed: @Todo
@ -126,8 +123,7 @@ reveal_type(d) # revealed: Literal[6]
### Starred expression (5) ### Starred expression (5)
```py ```py
# TODO: Remove 'not-iterable' diagnostic [a, b, *c] = (1, 2, 3, 4)
[a, b, *c] = (1, 2, 3, 4) # error: "Object of type `None` is not iterable"
reveal_type(a) # revealed: Literal[1] reveal_type(a) # revealed: Literal[1]
reveal_type(b) # revealed: Literal[2] reveal_type(b) # revealed: Literal[2]
# TODO: Should be list[int] once support for assigning to starred expression is added # TODO: Should be list[int] once support for assigning to starred expression is added
@ -215,8 +211,7 @@ reveal_type(b) # revealed: LiteralString
```py ```py
# TODO: Add diagnostic (need more values to unpack) # TODO: Add diagnostic (need more values to unpack)
# TODO: Remove 'not-iterable' diagnostic (a, *b, c, d) = "ab"
(a, *b, c, d) = "ab" # error: "Object of type `None` is not iterable"
reveal_type(a) # revealed: LiteralString reveal_type(a) # revealed: LiteralString
# TODO: Should be list[LiteralString] once support for assigning to starred expression is added # TODO: Should be list[LiteralString] once support for assigning to starred expression is added
reveal_type(b) # revealed: @Todo reveal_type(b) # revealed: @Todo
@ -227,7 +222,7 @@ reveal_type(d) # revealed: Unknown
### Starred expression (2) ### Starred expression (2)
```py ```py
(a, *b, c) = "ab" # error: "Object of type `None` is not iterable" (a, *b, c) = "ab"
reveal_type(a) # revealed: LiteralString reveal_type(a) # revealed: LiteralString
# TODO: Should be list[Any] once support for assigning to starred expression is added # TODO: Should be list[Any] once support for assigning to starred expression is added
reveal_type(b) # revealed: @Todo reveal_type(b) # revealed: @Todo
@ -237,8 +232,7 @@ reveal_type(c) # revealed: LiteralString
### Starred expression (3) ### Starred expression (3)
```py ```py
# TODO: Remove 'not-iterable' diagnostic (a, *b, c) = "abc"
(a, *b, c) = "abc" # error: "Object of type `None` is not iterable"
reveal_type(a) # revealed: LiteralString reveal_type(a) # revealed: LiteralString
# TODO: Should be list[LiteralString] once support for assigning to starred expression is added # TODO: Should be list[LiteralString] once support for assigning to starred expression is added
reveal_type(b) # revealed: @Todo reveal_type(b) # revealed: @Todo
@ -248,8 +242,7 @@ reveal_type(c) # revealed: LiteralString
### Starred expression (4) ### Starred expression (4)
```py ```py
# TODO: Remove 'not-iterable' diagnostic (a, *b, c, d) = "abcdef"
(a, *b, c, d) = "abcdef" # error: "Object of type `None` is not iterable"
reveal_type(a) # revealed: LiteralString reveal_type(a) # revealed: LiteralString
# TODO: Should be list[LiteralString] once support for assigning to starred expression is added # TODO: Should be list[LiteralString] once support for assigning to starred expression is added
reveal_type(b) # revealed: @Todo reveal_type(b) # revealed: @Todo
@ -260,8 +253,7 @@ reveal_type(d) # revealed: LiteralString
### Starred expression (5) ### Starred expression (5)
```py ```py
# TODO: Remove 'not-iterable' diagnostic (a, b, *c) = "abcd"
(a, b, *c) = "abcd" # error: "Object of type `None` is not iterable"
reveal_type(a) # revealed: LiteralString reveal_type(a) # revealed: LiteralString
reveal_type(b) # revealed: LiteralString reveal_type(b) # revealed: LiteralString
# TODO: Should be list[int] once support for assigning to starred expression is added # TODO: Should be list[int] once support for assigning to starred expression is added

View file

@ -1414,11 +1414,11 @@ impl<'db> TypeInferenceBuilder<'db> {
// Resolve the target type, assuming a load context. // Resolve the target type, assuming a load context.
let target_type = match &**target { let target_type = match &**target {
Expr::Name(name) => { Expr::Name(name) => {
self.store_expression_type(target, Type::None); self.store_expression_type(target, Type::Never);
self.infer_name_load(name) self.infer_name_load(name)
} }
Expr::Attribute(attr) => { Expr::Attribute(attr) => {
self.store_expression_type(target, Type::None); self.store_expression_type(target, Type::Never);
self.infer_attribute_load(attr) self.infer_attribute_load(attr)
} }
_ => self.infer_expression(target), _ => self.infer_expression(target),
@ -2506,7 +2506,7 @@ impl<'db> TypeInferenceBuilder<'db> {
fn infer_name_expression(&mut self, name: &ast::ExprName) -> Type<'db> { fn infer_name_expression(&mut self, name: &ast::ExprName) -> Type<'db> {
match name.ctx { match name.ctx {
ExprContext::Load => self.infer_name_load(name), ExprContext::Load => self.infer_name_load(name),
ExprContext::Store | ExprContext::Del => Type::None, ExprContext::Store | ExprContext::Del => Type::Never,
ExprContext::Invalid => Type::Unknown, ExprContext::Invalid => Type::Unknown,
} }
} }
@ -2536,7 +2536,7 @@ impl<'db> TypeInferenceBuilder<'db> {
ExprContext::Load => self.infer_attribute_load(attribute), ExprContext::Load => self.infer_attribute_load(attribute),
ExprContext::Store | ExprContext::Del => { ExprContext::Store | ExprContext::Del => {
self.infer_expression(value); self.infer_expression(value);
Type::None Type::Never
} }
ExprContext::Invalid => { ExprContext::Invalid => {
self.infer_expression(value); self.infer_expression(value);