Skip to content

Commit 09cdab4

Browse files
authored
mypy: remove has_member (python#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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy