Dynamically creating properties?

DevPlayer devplayer at gmail.com
Thu Oct 27 19:00:57 EDT 2011


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.


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /