为什么我不能直接在 OpenAI Gym 环境上设置属性

Why I can't I set an attribute on an OpenAI Gym environment directly

所以我 运行 在编写自定义 OpenAI 健身房环境时遇到了一个有趣的错误。下面的代码是我可以编写的重现错误的最小环境:

import gym

class TestEnv(gym.Env):
    obs = 3

    def set_obs(self, obs):
        self.obs = obs

    def reset(self):
        return self.obs

    def step(self, a):
        return self.obs, 0, False, None

gym.register('TestEnv-v0', 
             entry_point=f'{__name__}:TestEnv',
             max_episode_steps=1000)

env = gym.make('TestEnv-v0')
print(env.reset())
print(env.obs)
env.obs = 5
print(env.reset())
print(env.obs)
env.set_obs(8)
print(env.reset())
print(env.obs)
3
3
3
5
8
5

由于某些原因,调用set_obs和直接设置obs属性是有区别的!我从来没有在 Python 中应用 setter 函数的模式(它闻起来 Java 太多了),但在这里我必须使用它以便新的 obs 是实际考虑到了。

当您使用 gym.registermax_episode_steps 参数注册环境时,OpenAI Gym 会自动将您的环境包装到一个 TimeLimit 对象中,以确保在 max_episode_steps 之后环境 returns done=True。 Gym 包装器可以将函数调用(即 set_obs)转发到 unwrapperd 环境,但它们不会转发属性。所以 env.obs = 5TimeLimit 实例上设置 obs 属性而不是 TestEnv instance