Dynamically creating properties?

Steven D'Aprano steve+comp.lang.python at pearwood.info
Fri Oct 28 03:42:50 EDT 2011


On Thu, 27 Oct 2011 16:00:57 -0700, DevPlayer wrote:

> def isvalid_named_reference( astring ):
>     # "varible name" is really a named_reference 
>     # import string   # would be cleaner

I don't understand the comment about "variable name".

>     valid_first_char =
> '_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>     valid_rest =
> '_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

This would be better:

    import string
    valid_first_char = '_' + string.ascii_letters
    valid_rest = string.digits + valid_first_char



>     # 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

In Python 3 they are:

http://www.python.org/dev/peps/pep-3131/


>     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

You missed 'as' and 'with'. And 'nonlocal' in Python 3. Possibly others.

Try this instead:

    from keywords import iskeyword
    if iskeyword(astring): return False




-- 
Steven



More information about the Python-list mailing list