Personally I like to use this function instead of a "try: except:" because try-except will allow names like __metaclass__.
Remember, setattr(obj, attr_name, value) allows attr_name to be any valid str(). For example: '!@kdafk11', or '1_1', '1e-20', '0.0', '*one', '\n%%', etc. def isvalid_named_reference( astring ): # "varible name" is really a named_reference # import string # would be cleaner valid_first_char = '_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' valid_rest = '_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' # I think it's ok here for the rare type-check # as unicode named-references are not allowed if type(astring) is not str: return False if len(astring) == 0: return False if astring[0] not in valid_first_char: return False for c in astring[1:]: if c not in valid_rest: return False # Python keywords not allowed as named references (variable names) for astr in ['and', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'yield',]: if astring == astr: return False # valid names but bad idea if astring == '__builtins__': return None if astring == '__metaclass__': return None for astr in dir(__builtins__): if astring == astr: return None # use None as a warning # there might be more like __slots__, and other # module level effecting special names like '__metaclass__' return True Also when using dynamically created "varible names" to check if your objects have an attribute with that name already. -- http://mail.python.org/mailman/listinfo/python-list