def _safe_setattr(obj, name, value):
    """Safely sets the attribute of the specified object. This includes not
    setting attributes for final objects and setting __func__ for instancemethod
    typed objects.

    Args:
        obj: object to set an attribute for.
        name (str): new attribute name.
        value: new attribute value.

    Returns:
        bool: True if the set attribute was successful.
    """
    okey = id(obj)
    if okey in _set_failures or okey in _final_objs:
        return False
    
    import inspect
    try:
        if inspect.ismethod(obj):
            setattr(obj.__func__, name, value)
            return True
        else:
            if isinstance(obj, dict): # pragma: no cover
                obj[name] = value
            else:
                setattr(obj, name, value)
            return True
    except (TypeError, AttributeError):# pragma: no cover
        _set_failures.append(okey)
        msg.warn("Failed {}:{} attribute set on {}.".format(name, value, obj))
        return False