1
1
from typing import List , Dict , Any , Protocol , Tuple , get_type_hints
2
+ import inspect
2
3
3
4
import numpy as np
4
5
@@ -88,6 +89,7 @@ class ProxyWrapperBase:
88
89
data : DataContainer
89
90
axes : _Axes
90
91
stale : bool
92
+ required_keys : set = set ()
91
93
92
94
@_stale_wrapper
93
95
def draw (self , renderer ):
@@ -137,18 +139,38 @@ def _query_and_transform(self, renderer, *, xunits: List[str], yunits: List[str]
137
139
# doing the nu work here is nice because we can write it once, but we
138
140
# really want to push this computation down a layer
139
141
# TODO sort out how this interoperates with the transform stack
140
- data = {k : self .nus .get (k , lambda x : x )(v ) for k , v in data .items ()}
141
- self ._cache [cache_key ] = data
142
- return data
142
+ transformed_data = {}
143
+ for k , (nu , sig ) in self ._sigs .items ():
144
+ to_pass = set (sig .parameters )
145
+ transformed_data [k ] = nu (** {k : data [k ] for k in to_pass })
146
+ self ._cache [cache_key ] = transformed_data
147
+ return transformed_data
143
148
144
149
def __init__ (self , data , nus , ** kwargs ):
145
150
super ().__init__ (** kwargs )
146
151
self .data = data
147
152
self ._cache = LFUCache (64 )
148
153
# TODO make sure mutating this will invalidate the cache!
149
- self .nus = nus or {}
154
+ self ._nus = nus or {}
155
+ for k in self .required_keys :
156
+
157
+ def identity (** kwargs ):
158
+ (_ ,) = kwargs .values ()
159
+ return _
160
+
161
+ identity .__signature__ = inspect .Signature (
162
+ [inspect .Parameter (k , inspect .Parameter .POSITIONAL_OR_KEYWORD )]
163
+ )
164
+
165
+ self ._nus .setdefault (k , identity )
166
+ self ._sigs = {k : (nu , inspect .signature (nu )) for k , nu in self ._nus .items ()}
150
167
self .stale = True
151
168
169
+ # TODO add a setter
170
+ @property
171
+ def nus (self ):
172
+ return dict (self ._nus )
173
+
152
174
153
175
class ProxyWrapper (ProxyWrapperBase ):
154
176
_privtized_methods : Tuple [str , ...] = ()
@@ -163,7 +185,7 @@ def __getattr__(self, key):
163
185
return getattr (self ._wrapped_instance , key )
164
186
165
187
def __setattr__ (self , key , value ):
166
- if key in ("_wrapped_instance" , "data" , "_cache" , "nus " , "stale" ):
188
+ if key in ("_wrapped_instance" , "data" , "_cache" , "_nus " , "stale" , "_sigs " ):
167
189
super ().__setattr__ (key , value )
168
190
elif hasattr (self , "_wrapped_instance" ) and hasattr (self ._wrapped_instance , key ):
169
191
setattr (self ._wrapped_instance , key , value )
@@ -174,6 +196,7 @@ def __setattr__(self, key, value):
174
196
class LineWrapper (ProxyWrapper ):
175
197
_wrapped_class = _Line2D
176
198
_privtized_methods = ("set_xdata" , "set_ydata" , "set_data" , "get_xdata" , "get_ydata" , "get_data" )
199
+ required_keys = {"x" , "y" }
177
200
178
201
def __init__ (self , data : DataContainer , nus = None , / , ** kwargs ):
179
202
super ().__init__ (data , nus )
@@ -188,6 +211,7 @@ def draw(self, renderer):
188
211
189
212
def _update_wrapped (self , data ):
190
213
for k , v in data .items ():
214
+ k = {"x" : "xdata" , "y" : "ydata" }.get (k , k )
191
215
getattr (self ._wrapped_instance , f"set_{ k } " )(v )
192
216
193
217
@@ -244,10 +268,9 @@ class FormatedText(ProxyWrapper):
244
268
_wrapped_class = _Text
245
269
_privtized_methods = ("set_text" ,)
246
270
247
- def __init__ (self , data : DataContainer , format_func , nus = None , / , ** kwargs ):
271
+ def __init__ (self , data : DataContainer , nus = None , / , ** kwargs ):
248
272
super ().__init__ (data , nus )
249
273
self ._wrapped_instance = self ._wrapped_class (text = "" , ** kwargs )
250
- self ._format_func = format_func
251
274
252
275
@_stale_wrapper
253
276
def draw (self , renderer ):
@@ -257,7 +280,9 @@ def draw(self, renderer):
257
280
return self ._wrapped_instance .draw (renderer )
258
281
259
282
def _update_wrapped (self , data ):
260
- self ._wrapped_instance .set_text (self ._format_func (** data ))
283
+ for k , v in data .items ():
284
+ k = {"x" : "xdata" , "y" : "ydata" }.get (k , k )
285
+ getattr (self ._wrapped_instance , f"set_{ k } " )(v )
261
286
262
287
263
288
@_forwarder (
0 commit comments