code: async def play(self, board: chess.Board, limit: Limit, *, game: object = None, info: Info = INFO_NONE, ponder: bool = False, root_moves: Optional[Iterable[chess.Move]] = None, options: ConfigMapping = {}) -> PlayResult:
          
docs: Play a position.
  
          :param board: The position. The entire move stack will be sent to the
              engine.
          :param limit: An instance of :class:`chess.engine.Limit` that
              determines when to stop thinking.
          :param game: Optional. An arbitrary object that identifies the game.
              Will automatically inform the engine if the object is not equal
              to the previous game (e.g. ``ucinewgame``, ``new``).
          :param info: Selects which additional information to retrieve from the
              engine. ``INFO_NONE``, ``INFO_BASE`` (basic information that is
              trivial to obtain), ``INFO_SCORE``, ``INFO_PV``,
              ``INFO_REFUTATION``, ``INFO_CURRLINE``, ``INFO_ALL`` or any
              bitwise combination. Some overhead is associated with parsing
              extra information.
          :param ponder: Whether the engine should keep analysing in the
              background even after the result has been returned.
          :param root_moves: Optional. Consider only root moves from this list.
          :param options: Optional. A dictionary of engine options for the
              analysis. The previous configuration will be restored after the
              analysis is complete. You can permanently apply a configuration
              with :func:`~chess.engine.EngineProtocol.configure()`.