@@ -28,7 +28,8 @@ def _build_proxy_class(cls_name: str, builtins: nodes.Module) -> nodes.ClassDef:
2828
2929
3030def _function_type (
31- function : nodes .Lambda | bases .UnboundMethod , builtins : nodes .Module
31+ function : nodes .Lambda | nodes .FunctionDef | bases .UnboundMethod ,
32+ builtins : nodes .Module ,
3233) -> nodes .ClassDef :
3334 if isinstance (function , (scoped_nodes .Lambda , scoped_nodes .FunctionDef )):
3435 if function .root ().name == "builtins" :
@@ -96,20 +97,19 @@ def object_type(
9697
9798
9899def _object_type_is_subclass (
99- obj_type , class_or_seq , context : InferenceContext | None = None
100- ):
101- if not isinstance (class_or_seq , (tuple , list )):
102- class_seq = (class_or_seq ,)
103- else :
104- class_seq = class_or_seq
105-
106- if isinstance (obj_type , util .UninferableBase ):
100+ obj_type : InferenceResult | None ,
101+ class_or_seq : list [InferenceResult ],
102+ context : InferenceContext | None = None ,
103+ ) -> util .UninferableBase | bool :
104+ if isinstance (obj_type , util .UninferableBase ) or not isinstance (
105+ obj_type , nodes .ClassDef
106+ ):
107107 return util .Uninferable
108108
109109 # Instances are not types
110110 class_seq = [
111111 item if not isinstance (item , bases .Instance ) else util .Uninferable
112- for item in class_seq
112+ for item in class_or_seq
113113 ]
114114 # strict compatibility with issubclass
115115 # issubclass(type, (object, 1)) evaluates to true
@@ -124,13 +124,13 @@ def _object_type_is_subclass(
124124 return False
125125
126126
127- def object_isinstance (node , class_or_seq , context : InferenceContext | None = None ):
127+ def object_isinstance (
128+ node : InferenceResult ,
129+ class_or_seq : list [InferenceResult ],
130+ context : InferenceContext | None = None ,
131+ ) -> util .UninferableBase | bool :
128132 """Check if a node 'isinstance' any node in class_or_seq.
129133
130- :param node: A given node
131- :param class_or_seq: Union[nodes.NodeNG, Sequence[nodes.NodeNG]]
132- :rtype: bool
133-
134134 :raises AstroidTypeError: if the given ``classes_or_seq`` are not types
135135 """
136136 obj_type = object_type (node , context )
@@ -139,13 +139,13 @@ def object_isinstance(node, class_or_seq, context: InferenceContext | None = Non
139139 return _object_type_is_subclass (obj_type , class_or_seq , context = context )
140140
141141
142- def object_issubclass (node , class_or_seq , context : InferenceContext | None = None ):
142+ def object_issubclass (
143+ node : nodes .NodeNG ,
144+ class_or_seq : list [InferenceResult ],
145+ context : InferenceContext | None = None ,
146+ ) -> util .UninferableBase | bool :
143147 """Check if a type is a subclass of any node in class_or_seq.
144148
145- :param node: A given node
146- :param class_or_seq: Union[Nodes.NodeNG, Sequence[nodes.NodeNG]]
147- :rtype: bool
148-
149149 :raises AstroidTypeError: if the given ``classes_or_seq`` are not types
150150 :raises AstroidError: if the type of the given node cannot be inferred
151151 or its type's mro doesn't work
@@ -270,7 +270,7 @@ def object_len(node, context: InferenceContext | None = None):
270270 if (
271271 isinstance (node_frame , scoped_nodes .FunctionDef )
272272 and node_frame .name == "__len__"
273- and hasattr (inferred_node , "_proxied" )
273+ and isinstance (inferred_node , bases . Proxy )
274274 and inferred_node ._proxied == node_frame .parent
275275 ):
276276 message = (
0 commit comments