| 104 | |
| 105 | @classmethod |
| 106 | def for_module(cls: type[ModuleAnalyzer], modname: str) -> ModuleAnalyzer: |
| 107 | if ('module', modname) in cls.cache: |
| 108 | entry = cls.cache['module', modname] |
| 109 | if isinstance(entry, PycodeError): |
| 110 | raise entry |
| 111 | return entry |
| 112 | |
| 113 | try: |
| 114 | filename, source = cls.get_module_source(modname) |
| 115 | if source is not None: |
| 116 | obj = cls.for_string(source, modname, filename or '<string>') |
| 117 | elif filename is not None: |
| 118 | obj = cls.for_file(filename, modname) |
| 119 | except PycodeError as err: |
| 120 | cls.cache['module', modname] = err |
| 121 | raise |
| 122 | cls.cache['module', modname] = obj |
| 123 | return obj |
| 124 | |
| 125 | def __init__( |
| 126 | self, source: str, modname: str, srcname: str | os.PathLike[str] |