Skip to content

Commit 09cdab4

Browse files
authored
mypy: remove has_member (#8438)
In particular: - The test case mentioned in the code passes without it - The test case changed seems to have more desirable behaviour now, consider: ``` from typing import Any """ class C: def __radd__(self, other) -> float: return 1.234 """ C: Any class D(C): pass reveal_type("str" + D()) ```
1 parent 7af3191 commit 09cdab4

File tree

3 files changed

+2
-48
lines changed

3 files changed

+2
-48
lines changed

mypy/checkexpr.py

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2410,15 +2410,6 @@ def lookup_operator(op_name: str, base_type: Type) -> Optional[Type]:
24102410
"""Looks up the given operator and returns the corresponding type,
24112411
if it exists."""
24122412
local_errors = make_local_errors()
2413-
2414-
# TODO: Remove this call and rely just on analyze_member_access
2415-
# Currently, it seems we still need this to correctly deal with
2416-
# things like metaclasses?
2417-
#
2418-
# E.g. see the pythoneval.testMetaclassOpAccessAny test case.
2419-
if not self.has_member(base_type, op_name):
2420-
return None
2421-
24222413
member = analyze_member_access(
24232414
name=op_name,
24242415
typ=base_type,
@@ -3799,43 +3790,6 @@ def is_valid_keyword_var_arg(self, typ: Type) -> bool:
37993790
[self.named_type('builtins.unicode'),
38003791
AnyType(TypeOfAny.special_form)])))
38013792

3802-
def has_member(self, typ: Type, member: str) -> bool:
3803-
"""Does type have member with the given name?"""
3804-
# TODO: refactor this to use checkmember.analyze_member_access, otherwise
3805-
# these two should be carefully kept in sync.
3806-
typ = get_proper_type(typ)
3807-
3808-
if isinstance(typ, TypeVarType):
3809-
typ = get_proper_type(typ.upper_bound)
3810-
if isinstance(typ, TupleType):
3811-
typ = tuple_fallback(typ)
3812-
if isinstance(typ, LiteralType):
3813-
typ = typ.fallback
3814-
if isinstance(typ, Instance):
3815-
return typ.type.has_readable_member(member)
3816-
if isinstance(typ, CallableType) and typ.is_type_obj():
3817-
return typ.fallback.type.has_readable_member(member)
3818-
elif isinstance(typ, AnyType):
3819-
return True
3820-
elif isinstance(typ, UnionType):
3821-
result = all(self.has_member(x, member) for x in typ.relevant_items())
3822-
return result
3823-
elif isinstance(typ, TypeType):
3824-
# Type[Union[X, ...]] is always normalized to Union[Type[X], ...],
3825-
# so we don't need to care about unions here.
3826-
item = typ.item
3827-
if isinstance(item, TypeVarType):
3828-
item = get_proper_type(item.upper_bound)
3829-
if isinstance(item, TupleType):
3830-
item = tuple_fallback(item)
3831-
if isinstance(item, Instance) and item.type.metaclass_type is not None:
3832-
return self.has_member(item.type.metaclass_type, member)
3833-
if isinstance(item, AnyType):
3834-
return True
3835-
return False
3836-
else:
3837-
return False
3838-
38393793
def not_ready_callback(self, name: str, context: Context) -> None:
38403794
"""Called when we can't infer the type of a variable because it's not ready yet.
38413795

mypy/typeops.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -719,5 +719,5 @@ def custom_special_method(typ: Type, name: str, check_all: bool = False) -> bool
719719
if isinstance(typ, AnyType):
720720
# Avoid false positives in uncertain cases.
721721
return True
722-
# TODO: support other types (see ExpressionChecker.has_member())?
722+
# TODO: support other types (see analyze_member_access)?
723723
return False

test-data/unit/check-classes.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6650,7 +6650,7 @@ reveal_type(0.5 + C) # N: Revealed type is 'Any'
66506650

66516651
reveal_type(0.5 + D()) # N: Revealed type is 'Any'
66526652
reveal_type(D() + 0.5) # N: Revealed type is 'Any'
6653-
reveal_type("str" + D()) # N: Revealed type is 'builtins.str'
6653+
reveal_type("str" + D()) # N: Revealed type is 'Any'
66546654
reveal_type(D() + "str") # N: Revealed type is 'Any'
66556655

66566656

0 commit comments

Comments
 (0)