[ty] Do not function-like property for `Callable` type relations

This commit is contained in:
David Peter 2025-10-13 13:15:36 +02:00
parent d83d7a0dcd
commit b6954063c1
2 changed files with 18 additions and 11 deletions

View File

@ -1204,9 +1204,9 @@ python-version = "3.12"
from dataclasses import dataclass from dataclasses import dataclass
from typing import Callable from typing import Callable
from types import FunctionType from types import FunctionType
from ty_extensions import CallableTypeOf, TypeOf, static_assert, is_subtype_of, is_assignable_to from ty_extensions import CallableTypeOf, TypeOf, static_assert, is_subtype_of, is_assignable_to, is_equivalent_to
@dataclass @dataclass(order=True)
class C: class C:
x: int x: int
@ -1233,8 +1233,20 @@ static_assert(not is_assignable_to(EquivalentPureCallableType, DunderInitType))
static_assert(is_subtype_of(DunderInitType, EquivalentFunctionLikeCallableType)) static_assert(is_subtype_of(DunderInitType, EquivalentFunctionLikeCallableType))
static_assert(is_assignable_to(DunderInitType, EquivalentFunctionLikeCallableType)) static_assert(is_assignable_to(DunderInitType, EquivalentFunctionLikeCallableType))
static_assert(not is_subtype_of(EquivalentFunctionLikeCallableType, DunderInitType)) static_assert(is_subtype_of(EquivalentFunctionLikeCallableType, DunderInitType))
static_assert(not is_assignable_to(EquivalentFunctionLikeCallableType, DunderInitType)) static_assert(is_assignable_to(EquivalentFunctionLikeCallableType, DunderInitType))
static_assert(is_equivalent_to(EquivalentFunctionLikeCallableType, DunderInitType))
static_assert(is_subtype_of(DunderInitType, FunctionType)) static_assert(is_subtype_of(DunderInitType, FunctionType))
``` ```
It should be possible to mock out synthesized methods:
```py
from unittest.mock import Mock
def test_c():
c = C(1)
c.__lt__ = Mock()
```

View File

@ -9945,9 +9945,6 @@ impl<'db> CallableType<'db> {
relation_visitor: &HasRelationToVisitor<'db>, relation_visitor: &HasRelationToVisitor<'db>,
disjointness_visitor: &IsDisjointVisitor<'db>, disjointness_visitor: &IsDisjointVisitor<'db>,
) -> ConstraintSet<'db> { ) -> ConstraintSet<'db> {
if other.is_function_like(db) && !self.is_function_like(db) {
return ConstraintSet::from(false);
}
self.signatures(db).has_relation_to_impl( self.signatures(db).has_relation_to_impl(
db, db,
other.signatures(db), other.signatures(db),
@ -9970,10 +9967,8 @@ impl<'db> CallableType<'db> {
return ConstraintSet::from(true); return ConstraintSet::from(true);
} }
ConstraintSet::from(self.is_function_like(db) == other.is_function_like(db)).and(db, || {
self.signatures(db) self.signatures(db)
.is_equivalent_to_impl(db, other.signatures(db), visitor) .is_equivalent_to_impl(db, other.signatures(db), visitor)
})
} }
} }