File tree 4 files changed +19
-9
lines changed
4 files changed +19
-9
lines changed Original file line number Diff line number Diff line change
1
+ Fix false positive for isinstance-second-argument-not-valid-type when union types contains None.
2
+
3
+ Closes #8424
Original file line number Diff line number Diff line change 37
37
is_mapping ,
38
38
is_module_ignored ,
39
39
is_node_in_type_annotation_context ,
40
+ is_none ,
40
41
is_overload_stub ,
41
42
is_postponed_evaluation_enabled ,
42
43
is_super ,
@@ -798,8 +799,9 @@ def _is_c_extension(module_node: InferenceResult) -> bool:
798
799
def _is_invalid_isinstance_type (arg : nodes .NodeNG ) -> bool :
799
800
# Return True if we are sure that arg is not a type
800
801
if PY310_PLUS and isinstance (arg , nodes .BinOp ) and arg .op == "|" :
801
- return _is_invalid_isinstance_type (arg .left ) or _is_invalid_isinstance_type (
802
- arg .right
802
+ return any (
803
+ _is_invalid_isinstance_type (elt ) and not is_none (elt )
804
+ for elt in (arg .left , arg .right )
803
805
)
804
806
inferred = utils .safe_infer (arg )
805
807
if not inferred :
@@ -812,9 +814,10 @@ def _is_invalid_isinstance_type(arg: nodes.NodeNG) -> bool:
812
814
if isinstance (inferred , astroid .Instance ) and inferred .qname () == BUILTIN_TUPLE :
813
815
return False
814
816
if PY310_PLUS and isinstance (inferred , bases .UnionType ):
815
- return _is_invalid_isinstance_type (
816
- inferred .left
817
- ) or _is_invalid_isinstance_type (inferred .right )
817
+ return any (
818
+ _is_invalid_isinstance_type (elt ) and not is_none (elt )
819
+ for elt in (inferred .left , inferred .right )
820
+ )
818
821
return True
819
822
820
823
Original file line number Diff line number Diff line change 1
- ''' Tests for invalid isinstance with compound types'''
1
+ """ Tests for invalid isinstance with compound types"""
2
2
3
3
# True negatives
4
4
isinstance (0 , int | str )
5
5
isinstance (0 , int | int | int )
6
6
isinstance (0 , int | str | list | float )
7
7
isinstance (0 , (int | str ) | (list | float ))
8
+ isinstance (0 , int | None )
9
+ isinstance (0 , None | int )
8
10
9
11
IntOrStr = int | str
10
12
isinstance (0 , IntOrStr )
13
+ IntOrNone = int | None
14
+ isinstance (0 , IntOrNone )
11
15
ListOrDict = list | dict
12
16
isinstance (0 , (float | ListOrDict ) | IntOrStr )
13
17
Original file line number Diff line number Diff line change 1
- isinstance-second-argument-not-valid-type:15 :0:15 :22::Second argument of isinstance is not a type:INFERENCE
2
- isinstance-second-argument-not-valid-type:16 :0:16 :28::Second argument of isinstance is not a type:INFERENCE
3
- isinstance-second-argument-not-valid-type:18 :0:18 :24::Second argument of isinstance is not a type:INFERENCE
1
+ isinstance-second-argument-not-valid-type:19 :0:19 :22::Second argument of isinstance is not a type:INFERENCE
2
+ isinstance-second-argument-not-valid-type:20 :0:20 :28::Second argument of isinstance is not a type:INFERENCE
3
+ isinstance-second-argument-not-valid-type:22 :0:22 :24::Second argument of isinstance is not a type:INFERENCE
You can’t perform that action at this time.
0 commit comments