[Python-checkins] r43341 - in python/trunk: Lib/test/test_grammar.py Lib/test/test_inspect.py Python/ast.c (original) (raw)

Jeremy Hylton jeremy at alum.mit.edu
Thu Apr 6 21:07:31 CEST 2006


On 4/6/06, Guido van Rossum <guido at python.org> wrote:

Well, obviously (:-) the intention was that def f((x)): is the same as def f(x): just like the expression (x) is the same as the expression x. It doesn't become a tuple unless there's a comma (or unless it's an empty tuple). Which reminds me -- what does def f(()): do?

Syntax error. The fplist has to have at least one fpdef.

Jeremy

--Guido On 4/6/06, Jeremy Hylton <jeremy at alum.mit.edu> wrote: > On 3/27/06, neal.norwitz <python-checkins at python.org> wrote: > > Author: neal.norwitz > > Date: Mon Mar 27 10:58:23 2006 > > New Revision: 43341 > > > > Modified: > > python/trunk/Lib/test/testgrammar.py > > python/trunk/Lib/test/testinspect.py > > python/trunk/Python/ast.c > > Log: > > Fix SF bug #1458903 with AST compiler. > > > > def foo((x)): was getting recognized as requiring tuple unpacking > > which is not correct. > > > > Add tests for this case and the proper way to unpack a tuple of one: > > def foo((x,)): > > > > testinpsect was incorrect before. I'm not sure why it was passing, > > but that has been corrected with a test for both functions above. > > This means the test (and therefore inspect.getargspec()) are broken in 2.4. > > This is an interesting case (after a fashion). I can't find any text > in the language reference that explains what def f((x)): means. The > grammar production that handles this case is fplist, but there's no > comment about how to interpret an fplist of length 1. > > As Georg mentions in the bug report, old versions of Python did > pseudo-unpacking if you wrapped arguments in parentheses. It did > assign to a temporary variable, but didn't call unpack sequence on > them. I presume this code was what lead to the confusion in inspect. > > Jeremy > > > > > > > Modified: python/trunk/Lib/test/testgrammar.py > > ============================================================================== > > --- python/trunk/Lib/test/testgrammar.py (original) > > +++ python/trunk/Lib/test/testgrammar.py Mon Mar 27 10:58:23 2006 > > @@ -255,6 +255,10 @@ > > d22v(*(1, 2, 3, 4)) > > d22v(1, 2, *(3, 4, 5)) > > d22v(1, *(2, 3), **{'d': 4}) > > +def d31v((x)): pass > > +d31v(1) > > +def d32v((x,)): pass > > +d32v((1,)) > > > > ### lambdef: 'lambda' [varargslist] ':' test > > print 'lambdef' > > > > Modified: python/trunk/Lib/test/testinspect.py > > ============================================================================== > > --- python/trunk/Lib/test/testinspect.py (original) > > +++ python/trunk/Lib/test/testinspect.py Mon Mar 27 10:58:23 2006 > > @@ -304,10 +304,12 @@ > > self.assertArgSpecEquals(A.m, ['self']) > > > > def testgetargspecsublistofone(self): > > - def sublistOfOne((foo)): return 1 > > - > > + def sublistOfOne((foo,)): return 1 > > self.assertArgSpecEquals(sublistOfOne, [['foo']]) > > > > + def fakeSublistOfOne((foo)): return 1 > > + self.assertArgSpecEquals(fakeSublistOfOne, ['foo']) > > + > > def testclassifyoldstyle(self): > > class A: > > def s(): pass > > > > Modified: python/trunk/Python/ast.c > > ============================================================================== > > --- python/trunk/Python/ast.c (original) > > +++ python/trunk/Python/ast.c Mon Mar 27 10:58:23 2006 > > @@ -645,10 +645,17 @@ > > goto error; > > } > > if (NCH(ch) == 3) { > > - asdlseqSET(args, k++, > > - compilercomplexargs(c, CHILD(ch, 1))); > > - } > > - else if (TYPE(CHILD(ch, 0)) == NAME) { > > + ch = CHILD(ch, 1); > > + /* def foo((x)): is not complex, special case. */ > > + if (NCH(ch) != 1) { > > + /* We have complex arguments, setup for unpacking. */ > > + asdlseqSET(args, k++, compilercomplexargs(c, ch)); > > + } else { > > + /* def foo((x)): setup for checking NAME below. */ > > + ch = CHILD(ch, 0); > > + } > > + } > > + if (TYPE(CHILD(ch, 0)) == NAME) { > > exprty name; > > if (!strcmp(STR(CHILD(ch, 0)), "None")) { > > asterror(CHILD(ch, 0), "assignment to None"); _> > ________________________ > > Python-checkins mailing list > > Python-checkins at python.org > > http://mail.python.org/mailman/listinfo/python-checkins > > _> ________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins >

-- --Guido van Rossum (home page: http://www.python.org/~guido/)



More information about the Python-checkins mailing list