diff --git a/Lib/ast.py b/Lib/ast.py index 4c8c7795ff8..03b8a1b16b7 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -346,7 +346,10 @@ def __instancecheck__(cls, inst): except AttributeError: return False else: - return isinstance(value, _const_types[cls]) + return ( + isinstance(value, _const_types[cls]) and + not isinstance(value, _const_types_not.get(cls, ())) + ) return type.__instancecheck__(cls, inst) def _new(cls, *args, **kwargs): @@ -384,3 +387,6 @@ def __new__(cls, *args, **kwargs): NameConstant: (type(None), bool), Ellipsis: (type(...),), } +_const_types_not = { + Num: (bool,), +} diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index 897e705a42c..4bf77ff046e 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -411,12 +411,16 @@ def test_isinstance(self): self.assertFalse(isinstance(ast.Str('42'), ast.Bytes)) self.assertFalse(isinstance(ast.Num(42), ast.NameConstant)) self.assertFalse(isinstance(ast.Num(42), ast.Ellipsis)) + self.assertFalse(isinstance(ast.NameConstant(True), ast.Num)) + self.assertFalse(isinstance(ast.NameConstant(False), ast.Num)) self.assertFalse(isinstance(ast.Constant('42'), ast.Num)) self.assertFalse(isinstance(ast.Constant(42), ast.Str)) self.assertFalse(isinstance(ast.Constant('42'), ast.Bytes)) self.assertFalse(isinstance(ast.Constant(42), ast.NameConstant)) self.assertFalse(isinstance(ast.Constant(42), ast.Ellipsis)) + self.assertFalse(isinstance(ast.Constant(True), ast.Num)) + self.assertFalse(isinstance(ast.Constant(False), ast.Num)) self.assertFalse(isinstance(ast.Constant(), ast.Num)) self.assertFalse(isinstance(ast.Constant(), ast.Str)) diff --git a/Misc/NEWS.d/next/Library/2019-01-13-18-42-41.bpo-35733.eFfLiv.rst b/Misc/NEWS.d/next/Library/2019-01-13-18-42-41.bpo-35733.eFfLiv.rst new file mode 100644 index 00000000000..8e5ef9b8417 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-01-13-18-42-41.bpo-35733.eFfLiv.rst @@ -0,0 +1,2 @@ +``ast.Constant(boolean)`` no longer an instance of :class:`ast.Num`. Patch by Anthony +Sottile.