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

Guido van Rossum guido at python.org
Thu Apr 6 20:15:26 CEST 2006


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?

--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/test_grammar.py
> >    python/trunk/Lib/test/test_inspect.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,)):
> >
> > test_inpsect 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/test_grammar.py
> > ==============================================================================
> > --- python/trunk/Lib/test/test_grammar.py       (original)
> > +++ python/trunk/Lib/test/test_grammar.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/test_inspect.py
> > ==============================================================================
> > --- python/trunk/Lib/test/test_inspect.py       (original)
> > +++ python/trunk/Lib/test/test_inspect.py       Mon Mar 27 10:58:23 2006
> > @@ -304,10 +304,12 @@
> >          self.assertArgSpecEquals(A.m, ['self'])
> >
> >      def test_getargspec_sublistofone(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 test_classify_oldstyle(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) {
> > -                    asdl_seq_SET(args, k++,
> > -                                    compiler_complex_args(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. */
> > +                       asdl_seq_SET(args, k++, compiler_complex_args(c, ch));
> > +                   } else {
> > +                       /* def foo((x)): setup for checking NAME below. */
> > +                       ch = CHILD(ch, 0);
> > +                   }
> > +                }
> > +                if (TYPE(CHILD(ch, 0)) == NAME) {
> >                     expr_ty name;
> >                     if (!strcmp(STR(CHILD(ch, 0)), "None")) {
> >                             ast_error(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