def get_annotation(cls, fn):
        """Find the _schema_annotation attribute for the given function.

        This will descend through decorators until it finds something that has
        the attribute. If it doesn't find it anywhere, it will return None.

        :param func fn: Find the attribute on this function.
        :returns: an instance of
            :class:`~doctor.resource.ResourceSchemaAnnotation` or
            None.
        """
        while fn is not None:
            if hasattr(fn, '_schema_annotation'):
                return fn._schema_annotation
            fn = getattr(fn, 'im_func', fn)
            closure = getattr(fn, '__closure__', None)
            fn = closure[0].cell_contents if closure is not None else None
        return None
def get_annotation ( cls , fn ) : while fn is not None : if hasattr ( fn , '_schema_annotation' ) : return fn . _schema_annotation fn = getattr ( fn , 'im_func' , fn ) closure = getattr ( fn , '__closure__' , None ) fn = closure [ 0 ] . cell_contents if closure is not None else None return None
Find the _schema_annotation attribute for the given function.

        This will descend through decorators until it finds something that has
        the attribute. If it doesn't find it anywhere, it will return None.

        :param func fn: Find the attribute on this function.
        :returns: an instance of
            :class:`~doctor.resource.ResourceSchemaAnnotation` or
            None.