Skip to content

Commit 76da328

Browse files
elazargJukkaL
authored andcommitted
Check for member in type-fallback (#2822)
Fix subissue of #2413. Follow-up for #2475 * check for member in fallback * check for fallback only for type objects
1 parent 2289121 commit 76da328

File tree

2 files changed

+15
-0
lines changed

2 files changed

+15
-0
lines changed

mypy/checkexpr.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2071,6 +2071,8 @@ def has_member(self, typ: Type, member: str) -> bool:
20712071
# TODO TupleType => also consider tuple attributes
20722072
if isinstance(typ, Instance):
20732073
return typ.type.has_readable_member(member)
2074+
if isinstance(typ, CallableType) and typ.is_type_obj():
2075+
return typ.fallback.type.has_readable_member(member)
20742076
elif isinstance(typ, AnyType):
20752077
return True
20762078
elif isinstance(typ, UnionType):

test-data/unit/check-classes.test

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2831,3 +2831,16 @@ class M(Tuple[int]): pass
28312831
class C(metaclass=M): pass # E: Invalid metaclass 'M'
28322832

28332833
[builtins fixtures/tuple.pyi]
2834+
2835+
[case testMetaclassOperatorBeforeReversed]
2836+
class X:
2837+
def __radd__(self, x: int) -> int: ...
2838+
2839+
class Meta(type):
2840+
def __add__(cls, x: X) -> str: ...
2841+
2842+
class Concrete(metaclass=Meta):
2843+
pass
2844+
2845+
reveal_type(Concrete + X()) # E: Revealed type is 'builtins.str'
2846+
Concrete + "hello" # E: Unsupported operand types for + ("Meta" and "str")

0 commit comments

Comments
 (0)