docs: def _init_zeo_root(self, attempts=3):
          """
          Get and initialize the ZEO root object.
  
          Args:
              attempts (int, default 3): How many times to try, if the connection
                  was lost.
          """
          try:
              db_root = self._connection.root()
          except ConnectionStateError:
              if attempts <= 0:
                  raise
  
              self._open_connection()
              return self._init_zeo_root(attempts=attempts-1)
  
          # init the root, if it wasn't already declared
          if self.project_key and self.project_key not in db_root:
              with transaction.manager:
                  db_root[self.project_key] = self.default_type()
  
          self._root = db_root[self.project_key] if self.project_key else db_root