5
5
# LICENSE file in the root directory of this source tree.
6
6
7
7
# pyre-strict
8
+ # pyre-ignore-all-errors[3, 2, 16]
8
9
10
+ from importlib import metadata
11
+ from importlib .metadata import EntryPoint
9
12
from typing import Any , Dict , Optional
10
13
11
- import importlib_metadata as metadata
12
- from importlib_metadata import EntryPoint
13
14
14
-
15
- # pyre-ignore-all-errors[3, 2]
16
15
def load (group : str , name : str , default = None ):
17
16
"""
18
17
Loads the entry point specified by
@@ -30,13 +29,34 @@ def load(group: str, name: str, default=None):
30
29
raises an error.
31
30
"""
32
31
33
- entrypoints = metadata .entry_points ().select (group = group )
32
+ # [note_on_entrypoints]
33
+ # return type of importlib.metadata.entry_points() is different between python-3.9 and python-3.10
34
+ # https://docs.python.org/3.9/library/importlib.metadata.html#importlib.metadata.entry_points
35
+ # https://docs.python.org/3.10/library/importlib.metadata.html#importlib.metadata.entry_points
36
+ if hasattr (metadata .entry_points (), "select" ):
37
+ # python>=3.10
38
+ entrypoints = metadata .entry_points ().select (group = group )
34
39
35
- if name not in entrypoints .names and default is not None :
36
- return default
40
+ if name not in entrypoints .names and default is not None :
41
+ return default
42
+
43
+ ep = entrypoints [name ]
44
+ return ep .load ()
37
45
38
- ep = entrypoints [name ]
39
- return ep .load ()
46
+ else :
47
+ # python<3.10 (e.g. 3.9)
48
+ # metadata.entry_points() returns dict[str, tuple[EntryPoint]] (not EntryPoints) in python-3.9
49
+ entrypoints = metadata .entry_points ().get (group , ())
50
+
51
+ for ep in entrypoints :
52
+ if ep .name == name :
53
+ return ep .load ()
54
+
55
+ # [group].name not found
56
+ if default is not None :
57
+ return default
58
+ else :
59
+ raise KeyError (f"entrypoint { group } .{ name } not found" )
40
60
41
61
42
62
def _defer_load_ep (ep : EntryPoint ) -> object :
@@ -49,7 +69,6 @@ def run(*args: object, **kwargs: object) -> object:
49
69
return run
50
70
51
71
52
- # pyre-ignore-all-errors[3, 2]
53
72
def load_group (
54
73
group : str , default : Optional [Dict [str , Any ]] = None , skip_defaults : bool = False
55
74
):
@@ -87,7 +106,13 @@ def load_group(
87
106
88
107
"""
89
108
90
- entrypoints = metadata .entry_points ().select (group = group )
109
+ # see [note_on_entrypoints] above
110
+ if hasattr (metadata .entry_points (), "select" ):
111
+ # python>=3.10
112
+ entrypoints = metadata .entry_points ().select (group = group )
113
+ else :
114
+ # python<3.10 (e.g. 3.9)
115
+ entrypoints = metadata .entry_points ().get (group , ())
91
116
92
117
if len (entrypoints ) == 0 :
93
118
if skip_defaults :
0 commit comments