Skip to content

Commit 18d79d3

Browse files
committed
Make ROM loading more robust by using module level __getattr__
1 parent 6eb8ef8 commit 18d79d3

1 file changed

Lines changed: 28 additions & 24 deletions

File tree

src/python/roms/__init__.py

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,39 +7,33 @@
77

88
from typing import List, Union, Dict
99

10-
from ale_py.roms.utils import (
11-
SupportedPackage as _SupportedPackage,
12-
SupportedEntryPoint as _SupportedEntryPoint,
13-
SupportedDirectory as _SupportedDirectory,
14-
)
10+
from ale_py.roms.utils import SupportedPackage, SupportedEntryPoint, SupportedDirectory
1511

1612
# Precedence is as follows:
1713
# 1. Internal ROMs
1814
# 2. External ROMs
1915
# 3. ROMs from atari-py.roms
2016
# 4. ROMs from atari-py-roms.roms
21-
_ROM_PLUGINS: List[
22-
Union[_SupportedPackage, _SupportedEntryPoint, _SupportedDirectory]
23-
] = [
24-
_SupportedPackage("ale_py.roms"),
25-
_SupportedEntryPoint("ale_py.roms"),
26-
_SupportedPackage("atari_py.atari_roms"),
27-
_SupportedPackage("atari_py_roms.atari_roms"),
17+
ROM_PLUGINS: List[Union[SupportedPackage, SupportedEntryPoint, SupportedDirectory]] = [
18+
SupportedPackage("ale_py.roms"),
19+
SupportedEntryPoint("ale_py.roms"),
20+
SupportedPackage("atari_py.atari_roms"),
21+
SupportedPackage("atari_py_roms.atari_roms"),
2822
]
2923

3024
# Environment variable for ROM discovery.
3125
# ale-py will search for supported ROMs in:
3226
# ${ALE_PY_ROM_DIR}/*.bin
33-
_ROM_DIRECTORY_ENV_KEY = "ALE_PY_ROM_DIR"
34-
_ROM_DIRECTORY_ENV_VALUE = os.environ.get(_ROM_DIRECTORY_ENV_KEY, None)
27+
ROM_DIRECTORY_ENV_KEY = "ALE_PY_ROM_DIR"
28+
ROM_DIRECTORY_ENV_VALUE = os.environ.get(ROM_DIRECTORY_ENV_KEY, None)
3529

36-
if _ROM_DIRECTORY_ENV_VALUE is not None:
37-
_ROM_PLUGINS.append(_SupportedDirectory(_ROM_DIRECTORY_ENV_VALUE))
30+
if ROM_DIRECTORY_ENV_VALUE is not None:
31+
ROM_PLUGINS.append(SupportedDirectory(ROM_DIRECTORY_ENV_VALUE))
3832

3933

40-
def _resolve_roms() -> List[str]:
34+
def resolve_roms() -> Dict[str, pathlib.Path]:
4135
roms: Dict[str, pathlib.Path] = {}
42-
for package in _ROM_PLUGINS:
36+
for package in ROM_PLUGINS:
4337

4438
try:
4539
# Resolve supported / unsupported roms
@@ -62,7 +56,7 @@ def _resolve_roms() -> List[str]:
6256
)
6357

6458
if (
65-
isinstance(package, _SupportedPackage)
59+
isinstance(package, SupportedPackage)
6660
and package.package.startswith("atari_py")
6761
and len(roms_delta) > 0
6862
):
@@ -91,9 +85,19 @@ def _resolve_roms() -> List[str]:
9185
return roms
9286

9387

94-
_RESOLVED_ROMS = _resolve_roms()
88+
# Resolve all ROMs
89+
ROMS = resolve_roms()
90+
__all__ = list(ROMS.keys())
9591

96-
# Update module
97-
globals().update(_RESOLVED_ROMS)
98-
# Export resolved ROMs
99-
__all__ = list(_RESOLVED_ROMS.keys())
92+
93+
def __dir__() -> List[str]:
94+
return list(ROMS.keys())
95+
96+
97+
def __getattr__(name: str) -> pathlib.Path:
98+
if name not in ROMS:
99+
raise AttributeError(
100+
f"ROM {name} not found. Available ROMs: {','.join(__all__)}."
101+
)
102+
103+
return ROMS[name]

0 commit comments

Comments
 (0)