mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-10-30 23:47:40 +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