From 419d9a83d5688940b3dbb410029080ad7f2f71a8 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Sun, 10 Feb 2013 09:48:22 -0500 Subject: [PATCH] evaluate lambda keyword-only defaults after positional defaults (#16967 again) --- Lib/importlib/_bootstrap.py | 4 ++-- Lib/test/test_keywordonlyarg.py | 4 ++++ Python/compile.c | 4 ++-- Python/importlib.h | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index 652d0fdd44f..a75ddfb2d19 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -396,7 +396,7 @@ Known values: 3210 (added size modulo 2**32 to the pyc header) Python 3.3a1 3220 (changed PEP 380 implementation) Python 3.3a4 3230 (revert changes to implicit __class__ closure) - Python 3.4a1 3240 (evaluate positional default arguments before + Python 3.4a1 3250 (evaluate positional default arguments before keyword-only defaults) MAGIC must change whenever the bytecode emitted by the compiler may no @@ -404,7 +404,7 @@ longer be understood by older implementations of the eval loop (usually due to the addition of new opcodes). """ -_RAW_MAGIC_NUMBER = 3240 | ord('\r') << 16 | ord('\n') << 24 +_RAW_MAGIC_NUMBER = 3250 | ord('\r') << 16 | ord('\n') << 24 _MAGIC_BYTES = bytes(_RAW_MAGIC_NUMBER >> n & 0xff for n in range(0, 25, 8)) _PYCACHE = '__pycache__' diff --git a/Lib/test/test_keywordonlyarg.py b/Lib/test/test_keywordonlyarg.py index 7aabdfc4629..f0580d36863 100644 --- a/Lib/test/test_keywordonlyarg.py +++ b/Lib/test/test_keywordonlyarg.py @@ -183,6 +183,10 @@ class KeywordOnlyArgTestCase(unittest.TestCase): def f(v=a, x=b, *, y=c, z=d): pass self.assertEqual(str(err.exception), "global name 'b' is not defined") + with self.assertRaises(NameError) as err: + f = lambda v=a, x=b, *, y=c, z=d: None + self.assertEqual(str(err.exception), "global name 'b' is not defined") + def test_main(): run_unittest(KeywordOnlyArgTestCase) diff --git a/Python/compile.c b/Python/compile.c index a0df40c3233..61f35f82cd7 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1794,14 +1794,14 @@ compiler_lambda(struct compiler *c, expr_ty e) return 0; } + if (args->defaults) + VISIT_SEQ(c, expr, args->defaults); if (args->kwonlyargs) { int res = compiler_visit_kwonlydefaults(c, args->kwonlyargs, args->kw_defaults); if (res < 0) return 0; kw_default_count = res; } - if (args->defaults) - VISIT_SEQ(c, expr, args->defaults); if (!compiler_enter_scope(c, name, COMPILER_SCOPE_FUNCTION, (void *)e, e->lineno)) return 0; diff --git a/Python/importlib.h b/Python/importlib.h index f7ce167c13a..49ae28d7259 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -756,7 +756,7 @@ unsigned char _Py_M__importlib[] = { 114,101,109,111,118,101,100,49,1,0,0,115,2,0,0,0, 0,8,117,25,0,0,0,95,99,97,108,108,95,119,105,116, 104,95,102,114,97,109,101,115,95,114,101,109,111,118,101,100, - 105,168,12,0,0,117,1,0,0,0,13,105,16,0,0,0, + 105,178,12,0,0,117,1,0,0,0,13,105,16,0,0,0, 117,1,0,0,0,10,105,24,0,0,0,99,1,0,0,0, 0,0,0,0,2,0,0,0,3,0,0,0,99,0,0,0, 115,29,0,0,0,124,0,0,93,19,0,125,1,0,116,0,