[Python-checkins] cpython (merge 3.6 -> default): merge
raymond.hettinger
python-checkins at python.org
Mon Nov 21 20:25:08 EST 2016
https://hg.python.org/cpython/rev/a0da176233b9
changeset: 105324:a0da176233b9
parent: 105322:8b767fa186e7
parent: 105323:3aafb232f2db
user: Raymond Hettinger <python at rcn.com>
date: Mon Nov 21 17:24:58 2016 -0800
summary:
merge
files:
Lib/test/test_with.py | 15 ++++++++++++---
Misc/NEWS | 4 ++++
Python/ceval.c | 8 ++++----
3 files changed, 20 insertions(+), 7 deletions(-)
diff --git a/Lib/test/test_with.py b/Lib/test/test_with.py
--- a/Lib/test/test_with.py
+++ b/Lib/test/test_with.py
@@ -109,7 +109,7 @@
with foo: pass
self.assertRaises(NameError, fooNotDeclared)
- def testEnterAttributeError(self):
+ def testEnterAttributeError1(self):
class LacksEnter(object):
def __exit__(self, type, value, traceback):
pass
@@ -117,7 +117,16 @@
def fooLacksEnter():
foo = LacksEnter()
with foo: pass
- self.assertRaises(AttributeError, fooLacksEnter)
+ self.assertRaisesRegexp(AttributeError, '__enter__', fooLacksEnter)
+
+ def testEnterAttributeError2(self):
+ class LacksEnterAndExit(object):
+ pass
+
+ def fooLacksEnterAndExit():
+ foo = LacksEnterAndExit()
+ with foo: pass
+ self.assertRaisesRegexp(AttributeError, '__enter__', fooLacksEnterAndExit)
def testExitAttributeError(self):
class LacksExit(object):
@@ -127,7 +136,7 @@
def fooLacksExit():
foo = LacksExit()
with foo: pass
- self.assertRaises(AttributeError, fooLacksExit)
+ self.assertRaisesRegexp(AttributeError, '__exit__', fooLacksExit)
def assertRaisesSyntaxError(self, codestr):
def shouldRaiseSyntaxError(s):
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -15,6 +15,10 @@
- Issue #28532: Show sys.version when -V option is supplied twice.
+- Issue #27100: The with-statement now checks for __enter__ before it
+ checks for __exit__. This gives less confusing error messages when
+ both methods are missing. Patch by Jonathan Ellington.
+
- Issue #28746: Fix the set_inheritable() file descriptor method on platforms
that do not have the ioctl FIOCLEX and FIONCLEX commands.
diff --git a/Python/ceval.c b/Python/ceval.c
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -3141,15 +3141,15 @@
_Py_IDENTIFIER(__exit__);
_Py_IDENTIFIER(__enter__);
PyObject *mgr = TOP();
- PyObject *exit = special_lookup(mgr, &PyId___exit__), *enter;
+ PyObject *enter = special_lookup(mgr, &PyId___enter__), *exit;
PyObject *res;
+ if (enter == NULL)
+ goto error;
+ exit = special_lookup(mgr, &PyId___exit__);
if (exit == NULL)
goto error;
SET_TOP(exit);
- enter = special_lookup(mgr, &PyId___enter__);
Py_DECREF(mgr);
- if (enter == NULL)
- goto error;
res = PyObject_CallFunctionObjArgs(enter, NULL);
Py_DECREF(enter);
if (res == NULL)
--
Repository URL: https://hg.python.org/cpython
More information about the Python-checkins
mailing list