mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2025-02-07 07:00:49 +03:00
Optimize calling of overridden providers
This commit is contained in:
parent
902cec5364
commit
1dacd096f6
|
@ -13,7 +13,7 @@ Development version
|
||||||
|
|
||||||
3.4.0
|
3.4.0
|
||||||
-----
|
-----
|
||||||
- No features.
|
- Optimize calling of overridden providers (~15% faster).
|
||||||
|
|
||||||
3.3.7
|
3.3.7
|
||||||
-----
|
-----
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -9,10 +9,9 @@ cimport cython
|
||||||
# Base providers
|
# Base providers
|
||||||
cdef class Provider(object):
|
cdef class Provider(object):
|
||||||
cdef tuple __overridden
|
cdef tuple __overridden
|
||||||
cdef int __overridden_len
|
cdef Provider __last_overriding
|
||||||
|
|
||||||
cpdef object _provide(self, tuple args, dict kwargs)
|
cpdef object _provide(self, tuple args, dict kwargs)
|
||||||
cpdef object _call_last_overriding(self, tuple args, dict kwargs)
|
|
||||||
|
|
||||||
|
|
||||||
cdef class Object(Provider):
|
cdef class Object(Provider):
|
||||||
|
|
|
@ -83,7 +83,7 @@ cdef class Provider(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""Initializer."""
|
"""Initializer."""
|
||||||
self.__overridden = tuple()
|
self.__overridden = tuple()
|
||||||
self.__overridden_len = 0
|
self.__last_overriding = None
|
||||||
super(Provider, self).__init__()
|
super(Provider, self).__init__()
|
||||||
|
|
||||||
def __call__(self, *args, **kwargs):
|
def __call__(self, *args, **kwargs):
|
||||||
|
@ -91,8 +91,8 @@ cdef class Provider(object):
|
||||||
|
|
||||||
Callable interface implementation.
|
Callable interface implementation.
|
||||||
"""
|
"""
|
||||||
if self.__overridden_len != 0:
|
if self.__last_overriding is not None:
|
||||||
return self._call_last_overriding(args, kwargs)
|
return self.__last_overriding._provide(args, kwargs)
|
||||||
return self._provide(args, kwargs)
|
return self._provide(args, kwargs)
|
||||||
|
|
||||||
def __deepcopy__(self, memo):
|
def __deepcopy__(self, memo):
|
||||||
|
@ -146,12 +146,10 @@ cdef class Provider(object):
|
||||||
provider = Object(provider)
|
provider = Object(provider)
|
||||||
|
|
||||||
self.__overridden += (provider,)
|
self.__overridden += (provider,)
|
||||||
self.__overridden_len += 1
|
self.__last_overriding = provider
|
||||||
|
|
||||||
return OverridingContext(self, provider)
|
return OverridingContext(self, provider)
|
||||||
|
|
||||||
@cython.boundscheck(False)
|
|
||||||
@cython.wraparound(False)
|
|
||||||
def reset_last_overriding(self):
|
def reset_last_overriding(self):
|
||||||
"""Reset last overriding provider.
|
"""Reset last overriding provider.
|
||||||
|
|
||||||
|
@ -160,11 +158,14 @@ cdef class Provider(object):
|
||||||
|
|
||||||
:rtype: None
|
:rtype: None
|
||||||
"""
|
"""
|
||||||
if self.__overridden_len == 0:
|
if len(self.__overridden) == 0:
|
||||||
raise Error('Provider {0} is not overridden'.format(str(self)))
|
raise Error('Provider {0} is not overridden'.format(str(self)))
|
||||||
|
|
||||||
self.__overridden = self.__overridden[:self.__overridden_len - 1]
|
self.__overridden = self.__overridden[:-1]
|
||||||
self.__overridden_len -= 1
|
try:
|
||||||
|
self.__last_overriding = self.__overridden[-1]
|
||||||
|
except IndexError:
|
||||||
|
self.__last_overriding = None
|
||||||
|
|
||||||
def reset_override(self):
|
def reset_override(self):
|
||||||
"""Reset all overriding providers.
|
"""Reset all overriding providers.
|
||||||
|
@ -172,7 +173,7 @@ cdef class Provider(object):
|
||||||
:rtype: None
|
:rtype: None
|
||||||
"""
|
"""
|
||||||
self.__overridden = tuple()
|
self.__overridden = tuple()
|
||||||
self.__overridden_len = 0
|
self.__last_overriding = None
|
||||||
|
|
||||||
def delegate(self):
|
def delegate(self):
|
||||||
"""Return provider's delegate.
|
"""Return provider's delegate.
|
||||||
|
@ -190,13 +191,6 @@ cdef class Provider(object):
|
||||||
"""
|
"""
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
@cython.boundscheck(False)
|
|
||||||
@cython.wraparound(False)
|
|
||||||
cpdef object _call_last_overriding(self, tuple args, dict kwargs):
|
|
||||||
"""Call last overriding provider and return result."""
|
|
||||||
return <object>self.__overridden[self.__overridden_len - 1](*args,
|
|
||||||
**kwargs)
|
|
||||||
|
|
||||||
|
|
||||||
cdef class Object(Provider):
|
cdef class Object(Provider):
|
||||||
"""Object provider returns provided instance "as is".
|
"""Object provider returns provided instance "as is".
|
||||||
|
@ -332,10 +326,10 @@ cdef class ExternalDependency(Provider):
|
||||||
"""
|
"""
|
||||||
cdef object instance
|
cdef object instance
|
||||||
|
|
||||||
if self.__overridden_len == 0:
|
if self.__last_overriding is None:
|
||||||
raise Error('Dependency is not defined')
|
raise Error('Dependency is not defined')
|
||||||
|
|
||||||
instance = self._call_last_overriding(args, kwargs)
|
instance = self.__last_overriding._provide(args, kwargs)
|
||||||
|
|
||||||
if not isinstance(instance, self.instance_of):
|
if not isinstance(instance, self.instance_of):
|
||||||
raise Error('{0} is not an '.format(instance) +
|
raise Error('{0} is not an '.format(instance) +
|
||||||
|
|
Loading…
Reference in New Issue
Block a user