Skip to content

Commit bcceff6

Browse files
RogdhamDanielNoord
authored andcommitted
Fix isinstance-second-argument-not-valid-type for union types with None
(cherry picked from commit b5f2b01)
1 parent ed67cc8 commit bcceff6

File tree

4 files changed

+19
-9
lines changed

4 files changed

+19
-9
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Fix false positive for isinstance-second-argument-not-valid-type when union types contains None.
2+
3+
Closes #8424

pylint/checkers/typecheck.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
is_mapping,
3838
is_module_ignored,
3939
is_node_in_type_annotation_context,
40+
is_none,
4041
is_overload_stub,
4142
is_postponed_evaluation_enabled,
4243
is_super,
@@ -798,8 +799,9 @@ def _is_c_extension(module_node: InferenceResult) -> bool:
798799
def _is_invalid_isinstance_type(arg: nodes.NodeNG) -> bool:
799800
# Return True if we are sure that arg is not a type
800801
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)
803805
)
804806
inferred = utils.safe_infer(arg)
805807
if not inferred:
@@ -812,9 +814,10 @@ def _is_invalid_isinstance_type(arg: nodes.NodeNG) -> bool:
812814
if isinstance(inferred, astroid.Instance) and inferred.qname() == BUILTIN_TUPLE:
813815
return False
814816
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+
)
818821
return True
819822

820823

tests/functional/i/isinstance_second_argument_py310.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
1-
'''Tests for invalid isinstance with compound types'''
1+
"""Tests for invalid isinstance with compound types"""
22

33
# True negatives
44
isinstance(0, int | str)
55
isinstance(0, int | int | int)
66
isinstance(0, int | str | list | float)
77
isinstance(0, (int | str) | (list | float))
8+
isinstance(0, int | None)
9+
isinstance(0, None | int)
810

911
IntOrStr = int | str
1012
isinstance(0, IntOrStr)
13+
IntOrNone = int | None
14+
isinstance(0, IntOrNone)
1115
ListOrDict = list | dict
1216
isinstance(0, (float | ListOrDict) | IntOrStr)
1317

Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
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

0 commit comments

Comments
 (0)