为什么我不能直接在 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.register
和 max_episode_steps
参数注册环境时,OpenAI Gym 会自动将您的环境包装到一个 TimeLimit
对象中,以确保在 max_episode_steps
之后环境 returns done=True
。 Gym 包装器可以将函数调用(即 set_obs
)转发到 unwrapperd 环境,但它们不会转发属性。所以 env.obs = 5
在 TimeLimit
实例上设置 obs
属性而不是 TestEnv
instance
所以我 运行 在编写自定义 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.register
和 max_episode_steps
参数注册环境时,OpenAI Gym 会自动将您的环境包装到一个 TimeLimit
对象中,以确保在 max_episode_steps
之后环境 returns done=True
。 Gym 包装器可以将函数调用(即 set_obs
)转发到 unwrapperd 环境,但它们不会转发属性。所以 env.obs = 5
在 TimeLimit
实例上设置 obs
属性而不是 TestEnv
instance