mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-28 21:05:08 +00:00
[ty] Treat lambda functions as instances of types.FunctionType (#18431)
This commit is contained in:
parent
47698883ae
commit
f379eb6e62
2 changed files with 20 additions and 1 deletions
|
@ -115,3 +115,22 @@ a5: Callable[[], None] = lambda x: None
|
||||||
# error: [invalid-assignment]
|
# error: [invalid-assignment]
|
||||||
a6: Callable[[int], None] = lambda: None
|
a6: Callable[[int], None] = lambda: None
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Function-like behavior of lambdas
|
||||||
|
|
||||||
|
All `lambda` functions are instances of `types.FunctionType` and should have access to the same set
|
||||||
|
of attributes.
|
||||||
|
|
||||||
|
```py
|
||||||
|
x = lambda y: y
|
||||||
|
|
||||||
|
reveal_type(x.__code__) # revealed: CodeType
|
||||||
|
reveal_type(x.__name__) # revealed: str
|
||||||
|
reveal_type(x.__defaults__) # revealed: tuple[Any, ...] | None
|
||||||
|
reveal_type(x.__annotations__) # revealed: dict[str, @Todo(Support for `typing.TypeAlias`)]
|
||||||
|
reveal_type(x.__dict__) # revealed: dict[str, Any]
|
||||||
|
reveal_type(x.__doc__) # revealed: str | None
|
||||||
|
reveal_type(x.__kwdefaults__) # revealed: dict[str, Any] | None
|
||||||
|
reveal_type(x.__module__) # revealed: str
|
||||||
|
reveal_type(x.__qualname__) # revealed: str
|
||||||
|
```
|
||||||
|
|
|
@ -4956,7 +4956,7 @@ impl<'db> TypeInferenceBuilder<'db> {
|
||||||
// TODO: Useful inference of a lambda's return type will require a different approach,
|
// TODO: Useful inference of a lambda's return type will require a different approach,
|
||||||
// which does the inference of the body expression based on arguments at each call site,
|
// which does the inference of the body expression based on arguments at each call site,
|
||||||
// rather than eagerly computing a return type without knowing the argument types.
|
// rather than eagerly computing a return type without knowing the argument types.
|
||||||
CallableType::single(self.db(), Signature::new(parameters, Some(Type::unknown())))
|
CallableType::function_like(self.db(), Signature::new(parameters, Some(Type::unknown())))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the type of the first parameter if the given scope is function-like (i.e. function or lambda).
|
/// Returns the type of the first parameter if the given scope is function-like (i.e. function or lambda).
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue