mirror of
https://github.com/python/cpython.git
synced 2025-07-29 14:15:07 +00:00
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 commit is contained in:
parent
6c40359795
commit
33b730e33c
3 changed files with 19 additions and 6 deletions
|
@ -255,6 +255,10 @@ d22v(1, 2, 3, 4, 5)
|
||||||
d22v(*(1, 2, 3, 4))
|
d22v(*(1, 2, 3, 4))
|
||||||
d22v(1, 2, *(3, 4, 5))
|
d22v(1, 2, *(3, 4, 5))
|
||||||
d22v(1, *(2, 3), **{'d': 4})
|
d22v(1, *(2, 3), **{'d': 4})
|
||||||
|
def d31v((x)): pass
|
||||||
|
d31v(1)
|
||||||
|
def d32v((x,)): pass
|
||||||
|
d32v((1,))
|
||||||
|
|
||||||
### lambdef: 'lambda' [varargslist] ':' test
|
### lambdef: 'lambda' [varargslist] ':' test
|
||||||
print 'lambdef'
|
print 'lambdef'
|
||||||
|
|
|
@ -304,10 +304,12 @@ class TestClassesAndFunctions(unittest.TestCase):
|
||||||
self.assertArgSpecEquals(A.m, ['self'])
|
self.assertArgSpecEquals(A.m, ['self'])
|
||||||
|
|
||||||
def test_getargspec_sublistofone(self):
|
def test_getargspec_sublistofone(self):
|
||||||
def sublistOfOne((foo)): return 1
|
def sublistOfOne((foo,)): return 1
|
||||||
|
|
||||||
self.assertArgSpecEquals(sublistOfOne, [['foo']])
|
self.assertArgSpecEquals(sublistOfOne, [['foo']])
|
||||||
|
|
||||||
|
def fakeSublistOfOne((foo)): return 1
|
||||||
|
self.assertArgSpecEquals(fakeSublistOfOne, ['foo'])
|
||||||
|
|
||||||
def test_classify_oldstyle(self):
|
def test_classify_oldstyle(self):
|
||||||
class A:
|
class A:
|
||||||
def s(): pass
|
def s(): pass
|
||||||
|
|
15
Python/ast.c
15
Python/ast.c
|
@ -645,10 +645,17 @@ ast_for_arguments(struct compiling *c, const node *n)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (NCH(ch) == 3) {
|
if (NCH(ch) == 3) {
|
||||||
asdl_seq_SET(args, k++,
|
ch = CHILD(ch, 1);
|
||||||
compiler_complex_args(c, CHILD(ch, 1)));
|
/* def foo((x)): is not complex, special case. */
|
||||||
}
|
if (NCH(ch) != 1) {
|
||||||
else if (TYPE(CHILD(ch, 0)) == NAME) {
|
/* 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;
|
expr_ty name;
|
||||||
if (!strcmp(STR(CHILD(ch, 0)), "None")) {
|
if (!strcmp(STR(CHILD(ch, 0)), "None")) {
|
||||||
ast_error(CHILD(ch, 0), "assignment to None");
|
ast_error(CHILD(ch, 0), "assignment to None");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue