@@ -26,14 +26,13 @@ def BYPASS(value):
2626 return value
2727
2828
29- def _get_context (func , kwargs ):
29+ def _get_context (argspec , kwargs ):
3030 """Prepare a context for the serialization.
3131
32- :param func: Function which needs or does not need kwargs .
32+ :param argspec: The argspec of the serialization function .
3333 :param kwargs: Dict with context
3434 :return: Keywords arguments that function can accept.
3535 """
36- argspec = inspect .getargspec (func )
3736 if argspec .keywords is not None :
3837 return kwargs
3938 return dict ((arg , kwargs [arg ]) for arg in argspec .args if arg in kwargs )
@@ -48,6 +47,10 @@ def __init__(self, getter=None, setter=None):
4847 self .getter = getter
4948 self .setter = setter
5049
50+ @cached_property
51+ def _getter_argspec (self ):
52+ return inspect .getargspec (self .getter )
53+
5154 def get (self , obj , ** kwargs ):
5255 """Get an attribute from a value.
5356
@@ -56,7 +59,7 @@ def get(self, obj, **kwargs):
5659 """
5760 assert self .getter is not None , "Getter accessor is not specified."
5861 if callable (self .getter ):
59- return self .getter (obj , ** _get_context (self .getter , kwargs ))
62+ return self .getter (obj , ** _get_context (self ._getter_argspec , kwargs ))
6063
6164 assert isinstance (self .getter , string_types ), "Accessor must be a function or a dot-separated string."
6265
@@ -153,6 +156,10 @@ def accessor(self):
153156 attr = self .attr or self .name
154157 return Accessor (getter = attr , setter = attr )
155158
159+ @cached_property
160+ def _attr_type_serialize_argspec (self ):
161+ return inspect .getargspec (self .attr_type .serialize )
162+
156163 def serialize (self , value , ** kwargs ):
157164 """Serialize the attribute of the input data.
158165
@@ -172,7 +179,7 @@ def serialize(self, value, **kwargs):
172179 raise
173180 value = self .default () if callable (self .default ) else self .default
174181
175- return self .attr_type .serialize (value , ** _get_context (self .attr_type . serialize , kwargs ))
182+ return self .attr_type .serialize (value , ** _get_context (self ._attr_type_serialize_argspec , kwargs ))
176183
177184 return self .attr_type
178185
0 commit comments