def get_motor_attr(motor_class, name, *defargs):
    """If any Motor attributes can't be accessed, grab the equivalent PyMongo
    attribute. While we're at it, store some info about each attribute
    in the global motor_info dict.
    """
    attr = safe_getattr(motor_class, name)

    # Store some info for process_motor_nodes()
    full_name = '%s.%s.%s' % (
        motor_class.__module__, motor_class.__name__, name)

    full_name_legacy = 'motor.%s.%s.%s' % (
        motor_class.__module__, motor_class.__name__, name)

    # These sub-attributes are set in motor.asynchronize()
    has_coroutine_annotation = getattr(attr, 'coroutine_annotation', False)
    is_async_method = getattr(attr, 'is_async_method', False)
    is_cursor_method = getattr(attr, 'is_motorcursor_chaining_method', False)
    if is_async_method or is_cursor_method:
        pymongo_method = getattr(
            motor_class.__delegate_class__, attr.pymongo_method_name)
    else:
        pymongo_method = None

    # attr.doc is set by statement like 'error = AsyncRead(doc="OBSOLETE")'.
    is_pymongo_doc = pymongo_method and attr.__doc__ == pymongo_method.__doc__

    motor_info[full_name] = motor_info[full_name_legacy] = {
        'is_async_method': is_async_method or has_coroutine_annotation,
        'is_pymongo_docstring': is_pymongo_doc,
        'pymongo_method': pymongo_method,
    }

    return attr
def get_motor_attr ( motor_class , name , * defargs ) : attr = safe_getattr ( motor_class , name ) full_name = '%s.%s.%s' % ( motor_class . __module__ , motor_class . __name__ , name ) full_name_legacy = 'motor.%s.%s.%s' % ( motor_class . __module__ , motor_class . __name__ , name ) has_coroutine_annotation = getattr ( attr , 'coroutine_annotation' , False ) is_async_method = getattr ( attr , 'is_async_method' , False ) is_cursor_method = getattr ( attr , 'is_motorcursor_chaining_method' , False ) if is_async_method or is_cursor_method : pymongo_method = getattr ( motor_class . __delegate_class__ , attr . pymongo_method_name ) else : pymongo_method = None is_pymongo_doc = pymongo_method and attr . __doc__ == pymongo_method . __doc__ motor_info [ full_name ] = motor_info [ full_name_legacy ] = { 'is_async_method' : is_async_method or has_coroutine_annotation , 'is_pymongo_docstring' : is_pymongo_doc , 'pymongo_method' : pymongo_method , } return attr
If any Motor attributes can't be accessed, grab the equivalent PyMongo
    attribute. While we're at it, store some info about each attribute
    in the global motor_info dict.