Commit 4f4ba166 authored by Raymond Hettinger's avatar Raymond Hettinger

Issue #17331: Use isidentifier() instead of isalnum() to check for valid identifiers.

parent 409f6630
...@@ -323,24 +323,19 @@ def namedtuple(typename, field_names, verbose=False, rename=False): ...@@ -323,24 +323,19 @@ def namedtuple(typename, field_names, verbose=False, rename=False):
if rename: if rename:
seen = set() seen = set()
for index, name in enumerate(field_names): for index, name in enumerate(field_names):
if (not all(c.isalnum() or c=='_' for c in name) if (not name.isidentifier()
or _iskeyword(name) or _iskeyword(name)
or not name
or name[0].isdigit()
or name.startswith('_') or name.startswith('_')
or name in seen): or name in seen):
field_names[index] = '_%d' % index field_names[index] = '_%d' % index
seen.add(name) seen.add(name)
for name in [typename] + field_names: for name in [typename] + field_names:
if not all(c.isalnum() or c=='_' for c in name): if not name.isidentifier():
raise ValueError('Type names and field names can only contain ' raise ValueError('Type names and field names must be valid '
'alphanumeric characters and underscores: %r' % name) 'identifiers: %r' % name)
if _iskeyword(name): if _iskeyword(name):
raise ValueError('Type names and field names cannot be a ' raise ValueError('Type names and field names cannot be a '
'keyword: %r' % name) 'keyword: %r' % name)
if name[0].isdigit():
raise ValueError('Type names and field names cannot start with '
'a number: %r' % name)
seen = set() seen = set()
for name in field_names: for name in field_names:
if name.startswith('_') and not rename: if name.startswith('_') and not rename:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment