Skip to content

Commit df62cbc

Browse files
committed
refactor issubclass check into helper function
1 parent 5b35e9d commit df62cbc

File tree

1 file changed

+35
-29
lines changed

1 file changed

+35
-29
lines changed

mypy/checker.py

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3726,35 +3726,7 @@ def find_isinstance_check(self, node: Expression
37263726
elif refers_to_fullname(node.callee, 'builtins.issubclass'):
37273727
if len(node.args) != 2: # the error will be reported elsewhere
37283728
return {}, {}
3729-
expr = node.args[0]
3730-
if literal(expr) == LITERAL_TYPE:
3731-
vartype = get_proper_type(type_map[expr])
3732-
type = get_isinstance_type(node.args[1], type_map)
3733-
if (isinstance(vartype, TypeVarType)):
3734-
vartype = vartype.upper_bound
3735-
vartype = get_proper_type(vartype)
3736-
if isinstance(vartype, UnionType):
3737-
union_list = []
3738-
for t in get_proper_types(vartype.items):
3739-
if isinstance(t, TypeType):
3740-
union_list.append(t.item)
3741-
else:
3742-
# This is an error that should be reported earlier
3743-
# if we reach here, we refuse to do any type inference.
3744-
return {}, {}
3745-
vartype = UnionType(union_list)
3746-
elif isinstance(vartype, TypeType):
3747-
vartype = vartype.item
3748-
elif (isinstance(vartype, Instance) and
3749-
vartype.type.fullname() == 'builtins.type'):
3750-
vartype = self.named_type('builtins.object')
3751-
else:
3752-
# Any other object whose type we don't know precisely
3753-
# for example, Any or a custom metaclass.
3754-
return {}, {} # unknown type
3755-
yes_map, no_map = conditional_type_map(expr, vartype, type)
3756-
yes_map, no_map = map(convert_to_typetype, (yes_map, no_map))
3757-
return yes_map, no_map
3729+
return self.infer_issubclass_maps(node, type_map)
37583730
elif refers_to_fullname(node.callee, 'builtins.callable'):
37593731
if len(node.args) != 1: # the error will be reported elsewhere
37603732
return {}, {}
@@ -4197,6 +4169,40 @@ def push_type_map(self, type_map: 'TypeMap') -> None:
41974169
for expr, type in type_map.items():
41984170
self.binder.put(expr, type)
41994171

4172+
def infer_issubclass_maps(self, node: CallExpr,
4173+
type_map: Dict[Expression, Type]
4174+
) -> Tuple[TypeMap, TypeMap]:
4175+
expr = node.args[0]
4176+
if literal(expr) == LITERAL_TYPE:
4177+
vartype = type_map[expr]
4178+
type = get_isinstance_type(node.args[1], type_map)
4179+
if (isinstance(vartype, TypeVarType)):
4180+
vartype = vartype.upper_bound
4181+
vartype = get_proper_type(vartype)
4182+
if isinstance(vartype, UnionType):
4183+
union_list = []
4184+
for t in get_proper_types(vartype.items):
4185+
if isinstance(t, TypeType):
4186+
union_list.append(t.item)
4187+
else:
4188+
# This is an error that should be reported earlier
4189+
# if we reach here, we refuse to do any type inference.
4190+
return {}, {}
4191+
vartype = UnionType(union_list)
4192+
elif isinstance(vartype, TypeType):
4193+
vartype = vartype.item
4194+
elif (isinstance(vartype, Instance) and
4195+
vartype.type.fullname() == 'builtins.type'):
4196+
vartype = self.named_type('builtins.object')
4197+
else:
4198+
# Any other object whose type we don't know precisely
4199+
# for example, Any or a custom metaclass.
4200+
return {}, {} # unknown type
4201+
yes_map, no_map = conditional_type_map(expr, vartype, type)
4202+
yes_map, no_map = map(convert_to_typetype, (yes_map, no_map))
4203+
return yes_map, no_map
4204+
return {}, {}
4205+
42004206

42014207
def conditional_type_map(expr: Expression,
42024208
current_type: Optional[Type],

0 commit comments

Comments
 (0)