[Python-Dev] Anonymous + varargs: possible serious breakage -- please confirm!

Jeremy Hylton jeremy@alum.mit.edu
Thu, 25 Jan 2001 10:20:45 -0500 (EST)

>>>>> "TW" == Thomas Wouters <thomas@xs4all.net> writes:

  TW> On Wed, Jan 24, 2001 at 12:33:43PM -0800, Ka-Ping Yee wrote:
  >> Please try:

  >> >>> def f(a, (b, c), *d):
  >> ...  x = 1 ...  print a, b, c, d, x ...
  >> >>> f(1, (2, 3), 4)
  >> 1 2 3 Traceback (most recent call last): File "<stdin>", line 1,
  >> in ?  File "<stdin>", line 3, in f UnboundLocalError: local
  >> variable 'd' referenced before assignment
  >> >>>

  >> In Python 1.5.2, this prints "1 2 3 (4,)" as expected.

  >> I only have 1.5.2 and 2.1a1 to test.  I hope this problem isn't
  >> present in 2.0...

  TW> It isn't present in 2.0. This is probably related to Jeremy's
  TW> changes in the call mechanism or the compiler track, though
  TW> Jeremy himself is the best person to claim that for sure :)

The bug is in the compiler.  It creates varnames while it is parsing
the argument list.  While I got the handling of the anonymous tuples
right, I forgot to insert *varargs or **kwargs in varnames *before*
the names defined in the tuple.

I will fix it real soon now.

  >> Note that test_inspect was the only test to fail!  It might be
  >> the only test that checks anonymous and *varargs at the same
  >> time.  (Yet another reason to put inspect in the core...)

  TW> Well, this is not an inspect-specific test, so it shouldn't *be*
  TW> in test_inspect, it should be in test_extcall :)

It should probably be in test_grammar.  The ext call mechanism is only
invoked when the caller uses a form like 'f(*arg)'.  Perhaps the name
"ext call" isn't very clear.