(obj, attr, allow_dotted_names=True)
return obj
resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d

    Resolves a dotted attribute name to an object.  Raises
    an AttributeError if any attribute in the chain starts with a '_'.

    If the optional allow_dotted_names argument is false, dots are not
    supported and this function operates similar to getattr(obj, attr).
resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d
resolve_dotted_attribute ( a b . c . d ) = > a . b . c . d
def resolve_dotted_attribute(obj, attr, allow_dotted_names=True):
    """resolve_dotted_attribute(a, 'b.c.d') => a.b.c.d

    Resolves a dotted attribute name to an object.  Raises
    an AttributeError if any attribute in the chain starts with a '_'.

    If the optional allow_dotted_names argument is false, dots are not
    supported and this function operates similar to getattr(obj, attr).
    """

    if allow_dotted_names:
        attrs = attr.split('.')
    else:
        attrs = [attr]

    for i in attrs:
        if i.startswith('_'):
            raise AttributeError(
                'attempt to access private attribute "%s"' % i
                )
        else:
            obj = getattr(obj,i)
    return obj
def resolve_dotted_attribute ( obj , attr , allow_dotted_names = True ) : if allow_dotted_names : attrs = attr . split ( '.' ) else : attrs = [ attr ] for i in attrs : if i . startswith ( '_' ) : raise AttributeError ( 'attempt to access private attribute "%s"' % i ) else : obj = getattr ( obj , i ) return obj