@@ -571,10 +571,14 @@ def _infer_type_new_call(
571
571
raise InferenceError (context = context ) from e
572
572
if not isinstance (mcs , nodes .ClassDef ):
573
573
# Not a valid first argument.
574
- return None
574
+ raise InferenceError (
575
+ "type.__new__() requires a class for metaclass" , context = context
576
+ )
575
577
if not mcs .is_subtype_of ("builtins.type" ):
576
578
# Not a valid metaclass.
577
- return None
579
+ raise InferenceError (
580
+ "type.__new__() metaclass must be a subclass of type" , context = context
581
+ )
578
582
579
583
# Verify the name
580
584
try :
@@ -583,10 +587,14 @@ def _infer_type_new_call(
583
587
raise InferenceError (context = context ) from e
584
588
if not isinstance (name , nodes .Const ):
585
589
# Not a valid name, needs to be a const.
586
- return None
590
+ raise InferenceError (
591
+ "type.__new__() requires a constant for name" , context = context
592
+ )
587
593
if not isinstance (name .value , str ):
588
594
# Needs to be a string.
589
- return None
595
+ raise InferenceError (
596
+ "type.__new__() requires a string for name" , context = context
597
+ )
590
598
591
599
# Verify the bases
592
600
try :
@@ -595,14 +603,18 @@ def _infer_type_new_call(
595
603
raise InferenceError (context = context ) from e
596
604
if not isinstance (bases , nodes .Tuple ):
597
605
# Needs to be a tuple.
598
- return None
606
+ raise InferenceError (
607
+ "type.__new__() requires a tuple for bases" , context = context
608
+ )
599
609
try :
600
610
inferred_bases = [next (elt .infer (context = context )) for elt in bases .elts ]
601
611
except StopIteration as e :
602
612
raise InferenceError (context = context ) from e
603
613
if any (not isinstance (base , nodes .ClassDef ) for base in inferred_bases ):
604
614
# All the bases needs to be Classes
605
- return None
615
+ raise InferenceError (
616
+ "type.__new__() requires classes for bases" , context = context
617
+ )
606
618
607
619
# Verify the attributes.
608
620
try :
@@ -611,7 +623,9 @@ def _infer_type_new_call(
611
623
raise InferenceError (context = context ) from e
612
624
if not isinstance (attrs , nodes .Dict ):
613
625
# Needs to be a dictionary.
614
- return None
626
+ raise InferenceError (
627
+ "type.__new__() requires a dict for attrs" , context = context
628
+ )
615
629
cls_locals : dict [str , list [InferenceResult ]] = collections .defaultdict (list )
616
630
for key , value in attrs .items :
617
631
try :
@@ -664,9 +678,13 @@ def infer_call_result(
664
678
and self .bound .name == "type"
665
679
and self .name == "__new__"
666
680
and isinstance (caller , nodes .Call )
667
- and len (caller .args ) == 4
668
681
):
669
682
# Check if we have a ``type.__new__(mcs, name, bases, attrs)`` call.
683
+ if len (caller .args ) != 4 :
684
+ raise InferenceError (
685
+ f"type.__new__() requires 4 arguments, got { len (caller .args )} " ,
686
+ context = context ,
687
+ )
670
688
new_cls = self ._infer_type_new_call (caller , context )
671
689
if new_cls :
672
690
return iter ((new_cls ,))
0 commit comments