def infer_getattr(node, context=None):
obj, attr = _infer_getattr_args(node, context)<EOL>if (<EOL>obj is util.Uninferable<EOL>or attr is util.Uninferable<EOL>or not hasattr(obj, "<STR_LIT>")<EOL>):<EOL><INDENT>return util.Uninferable<EOL><DEDENT>try:<EOL><INDENT>return next(obj.igetattr(attr, context=context))<EOL><DEDENT>except (StopIteration, InferenceError, AttributeInferenceError):<EOL><INDENT>if len(node.args) == <NUM_LIT:3>:<EOL><INDENT>try:<EOL><INDENT>return next(node.args[<NUM_LIT:2>].infer(context=context))<EOL><DEDENT>except InferenceError:<EOL><INDENT>raise UseInferenceDefault<EOL><DEDENT><DEDENT><DEDENT>raise UseInferenceDefault<EOL>
Understand getattr calls

    If one of the arguments is an Uninferable object, then the
    result will be an Uninferable object. Otherwise, the normal attribute
    lookup will be done.