summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnthony Sottile <asottile@umich.edu>2019-01-18 19:30:28 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2019-01-18 19:30:28 (GMT)
commit74176226179ed56ad1c910bec5c4100e72ab4e84 (patch)
treef389c2d62a2852f04f969dba54edd6d93eb974d2
parent39ed289a3511d2e9bf0950a9d5dc53c8194f61b9 (diff)
downloadcpython-74176226179ed56ad1c910bec5c4100e72ab4e84.zip
cpython-74176226179ed56ad1c910bec5c4100e72ab4e84.tar.gz
cpython-74176226179ed56ad1c910bec5c4100e72ab4e84.tar.bz2
bpo-35733: Make isinstance(ast.Constant(boolean), ast.Num) be false. (GH-11547)
-rw-r--r--Lib/ast.py8
-rw-r--r--Lib/test/test_ast.py4
-rw-r--r--Misc/NEWS.d/next/Library/2019-01-13-18-42-41.bpo-35733.eFfLiv.rst2
3 files changed, 13 insertions, 1 deletions
diff --git a/Lib/ast.py b/Lib/ast.py
index 4c8c779..03b8a1b 100644
--- a/Lib/ast.py
+++ b/Lib/ast.py
@@ -346,7 +346,10 @@ class _ABC(type):
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 @@ _const_types = {
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 897e705..4bf77ff 100644
--- a/Lib/test/test_ast.py
+++ b/Lib/test/test_ast.py
@@ -411,12 +411,16 @@ class AST_Tests(unittest.TestCase):
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 0000000..8e5ef9b
--- /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.