code: def get_motor_attr(motor_class, name, *defargs):
      
      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
docs: 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.