Movatterモバイル変換
[0]ホーム
[Python-Dev] Anonymous + varargs: possible serious breakage -- please confirm!
Ka-Ping Yeeping@lfw.org
Wed, 24 Jan 2001 12:33:43 -0800 (PST)
Hi -- after updating my CVS tree today with Python 2.1a1, i ranthe tests and test_inspect failed. This revealed that the formatof code.co_varnames has changed. At first i tried to update theinspect.py module to check the Python version number and track thechange, but now i believe this is actually symptomatic of a realinterpreter problem.Consider the function: def f(a, (b, c), *d): x = 1 print a, b, c, d, xWhereas in Python 1.5.2: f.func_code.co_argcount = 2 f.func_code.co_nlocals = 6 f.func_code.co_names = ('x', 'a', 'b', 'c', 'd') f.func_code.co_varnames = ('a', '.2', 'd', 'b', 'c', 'x')In Python 2.1a1: f.func_code.co_argcount = 2 f.func_code.co_nlocals = 6 f.func_code.co_names = ('b', 'c', 'x', 'a', 'd') f.func_code.co_varnames = ('a', '.2', 'b', 'c', 'd', 'x')Notice how the ordering of the variable names has changed.I went and looked at the CO_VARARGS clause in eval_code2 tosee if it put the varargs and kwdict arguments in differentslots, but it appears unchanged! It still puts varargs atlocals[co_argcount] and kwdict at locals[co_argcount + 1].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 problemisn't present in 2.0...Note that test_inspect was the only test to fail! It might be theonly test that checks anonymous and *varargs at the same time.(Yet another reason to put inspect in the core...)I did recently check in additions to test_extcall that made thetest much beefier -- but that only tested combinations of regular,keyword, varargs, and kwdict arguments; it neglected to testanonymous (tuple) arguments as well.-- ?!ng
[8]ページ先頭