Skip to content

Commit a69f624

Browse files
authored
[red-knot] Infer lambda return type as Unknown (#16695)
## Summary Part of #15382 This PR infers the return type `lambda` expression as `Unknown`. In the future, it would be more useful to infer the expression type considering the surrounding context (#16696). ## Test Plan Update existing test cases from `@todo` to the (verified) return type.
1 parent c3d429d commit a69f624

File tree

2 files changed

+16
-13
lines changed

2 files changed

+16
-13
lines changed

crates/red_knot_python_semantic/resources/mdtest/expression/lambda.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
`lambda` expressions can be defined without any parameters.
66

77
```py
8-
reveal_type(lambda: 1) # revealed: () -> @Todo(lambda return type)
8+
reveal_type(lambda: 1) # revealed: () -> Unknown
99

1010
# error: [unresolved-reference]
11-
reveal_type(lambda: a) # revealed: () -> @Todo(lambda return type)
11+
reveal_type(lambda: a) # revealed: () -> Unknown
1212
```
1313

1414
## With parameters
@@ -17,45 +17,45 @@ Unlike parameters in function definition, the parameters in a `lambda` expressio
1717
annotated.
1818

1919
```py
20-
reveal_type(lambda a: a) # revealed: (a) -> @Todo(lambda return type)
21-
reveal_type(lambda a, b: a + b) # revealed: (a, b) -> @Todo(lambda return type)
20+
reveal_type(lambda a: a) # revealed: (a) -> Unknown
21+
reveal_type(lambda a, b: a + b) # revealed: (a, b) -> Unknown
2222
```
2323

2424
But, it can have default values:
2525

2626
```py
27-
reveal_type(lambda a=1: a) # revealed: (a=Literal[1]) -> @Todo(lambda return type)
28-
reveal_type(lambda a, b=2: a) # revealed: (a, b=Literal[2]) -> @Todo(lambda return type)
27+
reveal_type(lambda a=1: a) # revealed: (a=Literal[1]) -> Unknown
28+
reveal_type(lambda a, b=2: a) # revealed: (a, b=Literal[2]) -> Unknown
2929
```
3030

3131
And, positional-only parameters:
3232

3333
```py
34-
reveal_type(lambda a, b, /, c: c) # revealed: (a, b, /, c) -> @Todo(lambda return type)
34+
reveal_type(lambda a, b, /, c: c) # revealed: (a, b, /, c) -> Unknown
3535
```
3636

3737
And, keyword-only parameters:
3838

3939
```py
40-
reveal_type(lambda a, *, b=2, c: b) # revealed: (a, *, b=Literal[2], c) -> @Todo(lambda return type)
40+
reveal_type(lambda a, *, b=2, c: b) # revealed: (a, *, b=Literal[2], c) -> Unknown
4141
```
4242

4343
And, variadic parameter:
4444

4545
```py
46-
reveal_type(lambda *args: args) # revealed: (*args) -> @Todo(lambda return type)
46+
reveal_type(lambda *args: args) # revealed: (*args) -> Unknown
4747
```
4848

4949
And, keyword-varidic parameter:
5050

5151
```py
52-
reveal_type(lambda **kwargs: kwargs) # revealed: (**kwargs) -> @Todo(lambda return type)
52+
reveal_type(lambda **kwargs: kwargs) # revealed: (**kwargs) -> Unknown
5353
```
5454

5555
Mixing all of them together:
5656

5757
```py
58-
# revealed: (a, b, /, c=Literal[True], *args, *, d=Literal["default"], e=Literal[5], **kwargs) -> @Todo(lambda return type)
58+
# revealed: (a, b, /, c=Literal[True], *args, *, d=Literal["default"], e=Literal[5], **kwargs) -> Unknown
5959
reveal_type(lambda a, b, /, c=True, *args, d="default", e=5, **kwargs: None)
6060
```
6161

@@ -96,5 +96,5 @@ Here, a `lambda` expression is used as the default value for a parameter in anot
9696
expression.
9797

9898
```py
99-
reveal_type(lambda a=lambda x, y: 0: 2) # revealed: (a=(x, y) -> @Todo(lambda return type)) -> @Todo(lambda return type)
99+
reveal_type(lambda a=lambda x, y: 0: 2) # revealed: (a=(x, y) -> Unknown) -> Unknown
100100
```

crates/red_knot_python_semantic/src/types/infer.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3840,9 +3840,12 @@ impl<'db> TypeInferenceBuilder<'db> {
38403840
Parameters::empty()
38413841
};
38423842

3843+
// TODO: Useful inference of a lambda's return type will require a different approach,
3844+
// which does the inference of the body expression based on arguments at each call site,
3845+
// rather than eagerly computing a return type without knowing the argument types.
38433846
Type::Callable(CallableType::General(GeneralCallableType::new(
38443847
self.db(),
3845-
Signature::new(parameters, Some(todo_type!("lambda return type"))),
3848+
Signature::new(parameters, Some(Type::unknown())),
38463849
)))
38473850
}
38483851

0 commit comments

Comments
 (0)