]> granicus.if.org Git - python/commitdiff
Error checking was too aggressive (reported by Chris Tismer)
authorRaymond Hettinger <python@rcn.com>
Wed, 5 Dec 2007 18:11:08 +0000 (18:11 +0000)
committerRaymond Hettinger <python@rcn.com>
Wed, 5 Dec 2007 18:11:08 +0000 (18:11 +0000)
Lib/collections.py
Lib/test/test_collections.py

index 356d961203b4448f192068d9b0cdfcc9b8e6d79b..e551f20d8e1822f7e921e5892ffe0bb7a57cb1c5 100644 (file)
@@ -40,7 +40,7 @@ def namedtuple(typename, field_names, verbose=False):
         field_names = field_names.replace(',', ' ').split() # names separated by whitespace and/or commas
     field_names = tuple(field_names)
     for name in (typename,) + field_names:
-        if not name.replace('_', '').isalnum():
+        if not all(c.isalnum() or c=='_' for c in name):
             raise ValueError('Type names and field names can only contain alphanumeric characters and underscores: %r' % name)
         if _iskeyword(name):
             raise ValueError('Type names and field names cannot be a keyword: %r' % name)
@@ -48,7 +48,7 @@ def namedtuple(typename, field_names, verbose=False):
             raise ValueError('Type names and field names cannot start with a number: %r' % name)
     seen_names = set()
     for name in field_names:
-        if name.startswith('__') and name.endswith('__'):
+        if name.startswith('__') and name.endswith('__') and len(name) > 3:
             raise ValueError('Field names cannot start and end with double underscores: %r' % name)
         if name in seen_names:
             raise ValueError('Encountered duplicate field name: %r' % name)
index 52bae9afedbdc027fff9515c4597d665f26c992e..0b0b029d7f2f7fc13a0440635c85320225911ea6 100644 (file)
@@ -29,6 +29,7 @@ class TestNamedTuple(unittest.TestCase):
         self.assertRaises(ValueError, namedtuple, 'abc', 'efg efg ghi')    # duplicate field
 
         namedtuple('Point0', 'x1 y2')   # Verify that numbers are allowed in names
+        namedtuple('_', '_ __ ___')     # Verify that underscores are allowed
 
     def test_instance(self):
         Point = namedtuple('Point', 'x y')