Source code for pettingzoo.utils.wrappers.base

from __future__ import annotations

from typing import Any

import gymnasium.spaces
import numpy as np
from typing_extensions import override

from pettingzoo.utils.env import ActionType, AECEnv, AgentID, ObsType


[docs] class BaseWrapper(AECEnv[AgentID, ObsType, ActionType]): """Creates a wrapper around `env` parameter. All AECEnv wrappers should inherit from this base class """ def __init__(self, env: AECEnv[AgentID, ObsType, ActionType]): super().__init__() self.env = env def __getattr__(self, name: str) -> Any: """Returns an attribute with ``name``, unless ``name`` starts with an underscore.""" if name.startswith("_") and name != "_cumulative_rewards": raise AttributeError(f"accessing private attribute '{name}' is prohibited") return getattr(self.env, name) @property @override def unwrapped(self) -> AECEnv[AgentID, ObsType, ActionType]: return self.env.unwrapped @override def close(self) -> None: self.env.close() @override def render(self) -> None | np.ndarray | str | list[Any]: return self.env.render() @override def reset(self, seed: int | None = None, options: dict[str, Any] | None = None): self.env.reset(seed=seed, options=options) @override def observe(self, agent: AgentID) -> ObsType | None: return self.env.observe(agent) @override def state(self) -> np.ndarray: return self.env.state() @override def step(self, action: ActionType) -> None: self.env.step(action) @override def observation_space(self, agent: AgentID) -> gymnasium.spaces.Space[ObsType]: return self.env.observation_space(agent) @override def action_space(self, agent: AgentID) -> gymnasium.spaces.Space[ActionType]: return self.env.action_space(agent) @override def __str__(self) -> str: """Returns a name which looks like: "max_observation<space_invaders_v1>".""" return f"{type(self).__name__}<{self.env!s}>"