15
15
This defines some selector interface used as glue to combine
16
16
DataPack/multiPack processors and Pipeline.
17
17
"""
18
- from typing import Generic , Iterator , TypeVar
18
+ from typing import Generic , Iterator , TypeVar , Optional , Union , Dict , Any
19
19
20
20
import re
21
21
22
+ from forte .common .configuration import Config
23
+ from forte .common .configurable import Configurable
22
24
from forte .data .base_pack import BasePack
23
25
from forte .data .data_pack import DataPack
24
26
from forte .data .multi_pack import MultiPack
37
39
]
38
40
39
41
40
- class Selector (Generic [InputPackType , OutputPackType ]):
41
- def __init__ (self , ** kwargs ):
42
- pass
42
+ class Selector (Generic [InputPackType , OutputPackType ], Configurable ):
43
+ def __init__ (self ):
44
+ self . configs : Config = Config ({}, {})
43
45
44
46
def select (self , pack : InputPackType ) -> Iterator [OutputPackType ]:
45
47
raise NotImplementedError
46
48
49
+ def initialize (
50
+ self , configs : Optional [Union [Config , Dict [str , Any ]]] = None
51
+ ):
52
+ self .configs = self .make_configs (configs )
53
+
47
54
48
55
class DummySelector (Selector [InputPackType , InputPackType ]):
49
56
r"""Do nothing, return the data pack itself, which can be either
@@ -66,12 +73,23 @@ def select(self, pack: MultiPack) -> Iterator[DataPack]:
66
73
class NameMatchSelector (SinglePackSelector ):
67
74
r"""Select a :class:`DataPack` from a :class:`MultiPack` with specified
68
75
name.
76
+
77
+ This implementation takes special care for backward compatability:
78
+ Deprecated:
79
+ selector = NameMatchSelector(select_name="foo")
80
+ selector = NameMatchSelector("foo")
81
+ Now:
82
+ selector = NameMatchSelector()
83
+ selector.initialize(
84
+ configs={
85
+ "select_name": "foo"
86
+ }
87
+ )
69
88
"""
70
89
71
- def __init__ (self , select_name : str ):
90
+ def __init__ (self , select_name : Optional [ str ] = None ):
72
91
super ().__init__ ()
73
- assert select_name is not None
74
- self .select_name : str = select_name
92
+ self .select_name = select_name
75
93
76
94
def select (self , m_pack : MultiPack ) -> Iterator [DataPack ]:
77
95
matches = 0
@@ -85,23 +103,67 @@ def select(self, m_pack: MultiPack) -> Iterator[DataPack]:
85
103
f"Pack name { self .select_name } " f" not in the MultiPack"
86
104
)
87
105
106
+ def initialize (
107
+ self , configs : Optional [Union [Config , Dict [str , Any ]]] = None
108
+ ):
109
+ if self .select_name is not None :
110
+ super ().initialize ({"select_name" : self .select_name })
111
+ else :
112
+ super ().initialize (configs )
113
+
114
+ if self .configs ["select_name" ] is None :
115
+ raise ValueError ("select_name shouldn't be None." )
116
+ self .select_name = self .configs ["select_name" ]
117
+
118
+ @classmethod
119
+ def default_configs (cls ):
120
+ return {"select_name" : None }
121
+
88
122
89
123
class RegexNameMatchSelector (SinglePackSelector ):
90
- r"""Select a :class:`DataPack` from a :class:`MultiPack` using a regex."""
124
+ r"""Select a :class:`DataPack` from a :class:`MultiPack` using a regex.
125
+
126
+ This implementation takes special care for backward compatability:
127
+ Deprecated:
128
+ selector = RegexNameMatchSelector(select_name="^.*\\d$")
129
+ selector = RegexNameMatchSelector("^.*\\d$")
130
+ Now:
131
+ selector = RegexNameMatchSelector()
132
+ selector.initialize(
133
+ configs={
134
+ "select_name": "^.*\\d$"
135
+ }
136
+ )
137
+ """
91
138
92
- def __init__ (self , select_name : str ):
139
+ def __init__ (self , select_name : Optional [ str ] = None ):
93
140
super ().__init__ ()
94
- assert select_name is not None
95
- self .select_name : str = select_name
141
+ self .select_name = select_name
96
142
97
143
def select (self , m_pack : MultiPack ) -> Iterator [DataPack ]:
98
144
if len (m_pack .packs ) == 0 :
99
145
raise ValueError ("Multi-pack is empty" )
100
146
else :
101
147
for name , pack in m_pack .iter_packs ():
102
- if re .match (self .select_name , name ):
148
+ if re .match (self .select_name , name ): # type: ignore
103
149
yield pack
104
150
151
+ def initialize (
152
+ self , configs : Optional [Union [Config , Dict [str , Any ]]] = None
153
+ ):
154
+ if self .select_name is not None :
155
+ super ().initialize ({"select_name" : self .select_name })
156
+ else :
157
+ super ().initialize (configs )
158
+
159
+ if self .configs ["select_name" ] is None :
160
+ raise ValueError ("select_name shouldn't be None." )
161
+ self .select_name = self .configs ["select_name" ]
162
+
163
+ @classmethod
164
+ def default_configs (cls ):
165
+ return {"select_name" : None }
166
+
105
167
106
168
class FirstPackSelector (SinglePackSelector ):
107
169
r"""Select the first entry from :class:`MultiPack` and yield it."""
0 commit comments