Have namedtuple's field renamer assign names that

are consistent with the corresponding tuple index.
This commit is contained in:
Raymond Hettinger 2009-04-02 22:25:40 +00:00
parent 789be0c0a0
commit 756ab67a98
2 changed files with 7 additions and 7 deletions

View File

@ -178,7 +178,7 @@ def namedtuple(typename, field_names, verbose=False, rename=False):
if (not all(c.isalnum() or c=='_' for c in name) or _iskeyword(name) if (not all(c.isalnum() or c=='_' for c in name) or _iskeyword(name)
or not name or name[0].isdigit() or name.startswith('_') or not name or name[0].isdigit() or name.startswith('_')
or name in seen): or name in seen):
names[i] = '_%d' % (i+1) names[i] = '_%d' % i
seen.add(name) seen.add(name)
field_names = tuple(names) field_names = tuple(names)
for name in (typename,) + field_names: for name in (typename,) + field_names:

View File

@ -49,12 +49,12 @@ class TestNamedTuple(unittest.TestCase):
def test_name_fixer(self): def test_name_fixer(self):
for spec, renamed in [ for spec, renamed in [
[('efg', 'g%hi'), ('efg', '_2')], # field with non-alpha char [('efg', 'g%hi'), ('efg', '_1')], # field with non-alpha char
[('abc', 'class'), ('abc', '_2')], # field has keyword [('abc', 'class'), ('abc', '_1')], # field has keyword
[('8efg', '9ghi'), ('_1', '_2')], # field starts with digit [('8efg', '9ghi'), ('_0', '_1')], # field starts with digit
[('abc', '_efg'), ('abc', '_2')], # field with leading underscore [('abc', '_efg'), ('abc', '_1')], # field with leading underscore
[('abc', 'efg', 'efg', 'ghi'), ('abc', 'efg', '_3', 'ghi')], # duplicate field [('abc', 'efg', 'efg', 'ghi'), ('abc', 'efg', '_2', 'ghi')], # duplicate field
[('abc', '', 'x'), ('abc', '_2', 'x')], # fieldname is a space [('abc', '', 'x'), ('abc', '_1', 'x')], # fieldname is a space
]: ]:
self.assertEqual(namedtuple('NT', spec, rename=True)._fields, renamed) self.assertEqual(namedtuple('NT', spec, rename=True)._fields, renamed)