Spaces:
Running
Running
| """Patch speechbrain's LazyModule so it plays nicely with Python 3.13 + torch. | |
| Bug: | |
| On Py 3.13, torch's internal `register_fake` calls `inspect.getmodule()` on | |
| every module in `sys.modules`. `getmodule` probes with `hasattr(m, '__file__')`. | |
| speechbrain's LazyModule.__getattr__ eagerly imports the target on any | |
| attribute access; if the target is an uninstalled optional integration | |
| (e.g. `speechbrain.integrations.k2_fsa`), it raises ImportError, which | |
| `hasattr` won't swallow (only AttributeError is caught), so the torch op | |
| registration blows up. | |
| Fix: | |
| Make LazyModule's __getattr__ raise AttributeError instead of ImportError | |
| for attribute probes. Actual "use the module" calls still work the same | |
| (they access a specific non-dunder attribute, which re-triggers import). | |
| Safe to import multiple times; idempotent. | |
| """ | |
| from __future__ import annotations | |
| def _patch() -> None: | |
| try: | |
| from speechbrain.utils.importutils import LazyModule | |
| except Exception: | |
| return # speechbrain not installed; nothing to patch | |
| if getattr(LazyModule, "_vanta_patched", False): | |
| return | |
| orig_getattr = LazyModule.__getattr__ | |
| def safe_getattr(self, attr): | |
| try: | |
| return orig_getattr(self, attr) | |
| except ImportError as e: | |
| # Translate to AttributeError so hasattr()/inspect probes behave. | |
| raise AttributeError(str(e)) from e | |
| LazyModule.__getattr__ = safe_getattr | |
| LazyModule._vanta_patched = True | |
| _patch() | |