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

Jeremy Hylton jeremy at alum.mit.edu
Thu Apr 6 14:22:16 CEST 2006


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
>


More information about the Python-checkins mailing list