Gymnasium

Stars

Farama Foundation 维护的标准单智能体强化学习环境 API,提供环境注册、创建、向量化和 Wrapper 组合机制,并包含经典控制、Box2D、MuJoCo 等参考环境与工具。

Reinforcement LearningEnvironment Registry · WrappersPython · Vector Environments
RL ENVIRONMENT REGISTRY · PYTHON DESCRIPTORS

类上看见 metadata,不代表现在就拿到了字典

Wrapper 通过实例 property 委托底层环境元数据;注册器必须区分描述符与具体值,同时继续拒绝真正非法的类级 metadata。

REGISTERED ENTRY POINTRegisteredWrapperclass RegisteredWrapper(gym.Wrapper)
class accessmetadata → property

instance access delegates to wrapped Env

BEFORE · PRE-CONSTRUCTION CHECK_check_metadata(env_creator.metadata)
expecteddictreceivedproperty
InvalidMetadata

make() · make_vec() stop before __init__

AFTER · DESCRIPTOR-AWARE BRANCHif not isinstance(metadata, property)
PROPERTYconstruct WrapperCONCRETE VALUEvalidate dict
2 wrappers created ✓list metadata rejected ✓
VALID ENTRY · STRICT CONTRACT
构造前失败

合法 Wrapper 被当成非法环境拒绝

环境注册允许把 `gymnasium.Wrapper` 子类直接作为 entry point,但 Wrapper 的类级 `metadata` 是一个实例属性:只有构造实例后才会委托到底层环境。旧版 `make()` 在构造前读取类属性,得到的是 `property` 描述符,却把它当作具体 metadata 字典交给 `_check_metadata()`;结果合法的 Wrapper 入口会在 `make()` 与 `make_vec()` 真正实例化之前被 `InvalidMetadata` 拒绝。

描述符语义

Property 只有绑定实例后才返回元数据

同名类属性不一定已经是可验证的数据。普通 Env 子类可以提供具体的字典 metadata,Wrapper 则通过 property 在实例层动态委托;预构造阶段必须区分这两类对象。修复不能全面跳过 metadata 校验,否则真正把列表等非法值写在类上的环境会失去早期错误提示,只应绕开尚未绑定实例的 property 描述符。

校验分流

只跳过 Property,具体值继续验证

先缓存 `env_creator.metadata`,若它是 `property` 就留到 Wrapper 实例创建后的正常委托路径;否则继续执行原有字典结构和 render modes 校验。同时把错误信息中的 `type(metadata)` 改为 `type(testing_metadata)`,避免把导入模块的类型误报成用户值。回归注册一个 Wrapper entry point,并由 `make_vec(..., num_envs=2)` 验证两个实例都保留 Wrapper;另一用例确认具体的列表 metadata 仍被拒绝且报告 `list`。

契约保持

向量化可创建,非法列表仍准确报错

Wrapper 子类现在可以作为注册入口被单环境和同步向量环境正常构造,既不要求伪造类级字典,也不削弱普通环境的 metadata 契约。定向 `make_vec` 测试 41 项、注册测试 107 项通过;完整测试记录 4,390 项通过、146 项跳过,两个约 1e−16 的 MuJoCo 精度失败可在未修改主分支复现。