class_docstr: Base class for vectorized environments. Runs multiple independent copies of the same environment in parallel.
  
  This is not the same as 1 environment that has multiple subcomponents, but it is many copies of the same base env.
  
  Each observation returned from vectorized environment is a batch of observations for each parallel environment.
  And :meth:`step` is also expected to receive a batch of actions for each parallel environment.
  
  Notes:
      All parallel environments should share the identical observation and action spaces.
      In other words, a vector of multiple different environments is not supported.
docstr: Add env info to the info dictionary of the vectorized environment.
  
  Given the `info` of a single environment add it to the `infos` dictionary
  which represents all the infos of the vectorized environment.
  Every `key` of `info` is paired with a boolean mask `_key` representing
  whether or not the i-indexed environment has this `info`.
  
  Args:
      infos (dict): the infos of the vectorized environment
      info (dict): the info coming from the single environment
      env_num (int): the index of the single environment
  
  Returns:
      infos (dict): the (updated) infos of the vectorized environment
code: def _add_info(self, infos: dict, info: dict, env_num: int) -> dict:
      """Add env info to the info dictionary of the vectorized environment.
  
      Given the `info` of a single environment add it to the `infos` dictionary
      which represents all the infos of the vectorized environment.
      Every `key` of `info` is paired with a boolean mask `_key` representing
      whether or not the i-indexed environment has this `info`.
  
      Args:
          infos (dict): the infos of the vectorized environment
          info (dict): the info coming from the single environment
          env_num (int): the index of the single environment
  
      Returns:
          infos (dict): the (updated) infos of the vectorized environment
  
      """
      for k in info.keys():
          if k not in infos:
              info_array, array_mask = self._init_info_arrays(
                  type(info[k])
              )
          else:
              info_array, array_mask = infos[k], infos[f"_{k}"]
  
          info_array[env_num], array_mask[env_num] = info[k], True
          infos[k], infos[f"_{k}"] = info_array, array_mask
      return infos
  
imports: from typing import Any, List, Optional, Tuple, Union
  import numpy
  import gym
  from gym.vector.utils.spaces import batch_space
label_desc: Use image node_id 15 for calling the VectorEnv obj's underlying member method code with example usage: obj._add_info(infos, info, env_num) and returns: infos