Return the package's loader if it's a ResourceReader.
(package: types.ModuleType)
| 57 | |
| 58 | |
| 59 | def get_resource_reader(package: types.ModuleType) -> Optional[ResourceReader]: |
| 60 | """ |
| 61 | Return the package's loader if it's a ResourceReader. |
| 62 | """ |
| 63 | # We can't use |
| 64 | # a issubclass() check here because apparently abc.'s __subclasscheck__() |
| 65 | # hook wants to create a weak reference to the object, but |
| 66 | # zipimport.zipimporter does not support weak references, resulting in a |
| 67 | # TypeError. That seems terrible. |
| 68 | spec = package.__spec__ |
| 69 | reader = getattr(spec.loader, 'get_resource_reader', None) # type: ignore[union-attr] |
| 70 | if reader is None: |
| 71 | return None |
| 72 | return reader(spec.name) # type: ignore[union-attr] |
| 73 | |
| 74 | |
| 75 | @functools.singledispatch |