5
5
import abc
6
6
import collections
7
7
import enum
8
+ import importlib
8
9
import importlib .machinery
9
10
import importlib .util
10
11
import os
11
12
import sys
12
13
import zipimport
13
14
from functools import lru_cache
14
15
from pathlib import Path
16
+ from typing import List , Optional
15
17
16
18
from . import util
17
19
@@ -60,7 +62,13 @@ def __init__(self, path=None):
60
62
self ._path = path or sys .path
61
63
62
64
@abc .abstractmethod
63
- def find_module (self , modname , module_parts , processed , submodule_path ):
65
+ def find_module (
66
+ self ,
67
+ modname : str ,
68
+ module_parts : List [str ],
69
+ processed : List [str ],
70
+ submodule_path : Optional [List [str ]],
71
+ ) -> Optional [ModuleSpec ]:
64
72
"""Find the given module
65
73
66
74
Each finder is responsible for each protocol of finding, as long as
@@ -91,9 +99,13 @@ class ImportlibFinder(Finder):
91
99
+ [(s , ModuleType .PY_COMPILED ) for s in importlib .machinery .BYTECODE_SUFFIXES ]
92
100
)
93
101
94
- def find_module (self , modname , module_parts , processed , submodule_path ):
95
- if not isinstance (modname , str ):
96
- raise TypeError (f"'modname' must be a str, not { type (modname )} " )
102
+ def find_module (
103
+ self ,
104
+ modname : str ,
105
+ module_parts : List [str ],
106
+ processed : List [str ],
107
+ submodule_path : Optional [List [str ]],
108
+ ) -> Optional [ModuleSpec ]:
97
109
if submodule_path is not None :
98
110
submodule_path = list (submodule_path )
99
111
else :
@@ -109,7 +121,7 @@ def find_module(self, modname, module_parts, processed, submodule_path):
109
121
if spec .loader is importlib .machinery .FrozenImporter :
110
122
return ModuleSpec (
111
123
name = modname ,
112
- location = None ,
124
+ location = getattr ( spec . loader_state , "filename" , None ) ,
113
125
module_type = ModuleType .PY_FROZEN ,
114
126
)
115
127
except ValueError :
0 commit comments