11# cython: language=c++
2- # cython: language_level=3
3- # cython: binding=True
4- # cython: cdivision=True
5- # cython: boundscheck=False
6- # cython: initializedcheck=False
72import json
83import logging
94from typing import Any, Optional, Type, TypeVar, Union
@@ -190,19 +185,29 @@ cdef class InputFilter:
190185 cdef dict errors = {}
191186 cdef dict validated_data = {}
192187
193- cdef object default
194- cdef object fallback
195- cdef list filters
196- cdef list validators
197- cdef object external_api
198- cdef str copy
199-
200- cdef list global_filters = self .global_filters
201- cdef list global_validators = self .global_validators
202- cdef bint has_global_filters = bool (global_filters)
203- cdef bint has_global_validators = bool (global_validators)
204-
205- for field_name, field_info in self .fields.items():
188+ cdef:
189+ list global_filters = self .global_filters
190+ list global_validators = self .global_validators
191+ bint has_global_filters = bool (global_filters)
192+ bint has_global_validators = bool (global_validators)
193+
194+ cdef:
195+ int i = 0
196+ int n = len (self .fields)
197+ list field_names = list (self .fields.keys())
198+ list field_infos = list (self .fields.values())
199+
200+ cdef:
201+ object default
202+ object fallback
203+ list filters
204+ list validators
205+ object external_api
206+ str copy
207+
208+ for i in range (n):
209+ field_name = field_names[i]
210+ field_info = field_infos[i]
206211 try :
207212 if field_info.copy:
208213 value = validated_data.get(field_info.copy)
@@ -216,27 +221,27 @@ cdef class InputFilter:
216221 value = data.get(field_name)
217222
218223 if field_info.filters or has_global_filters:
219- filters = field_info.filters
220- if has_global_filters:
221- filters = filters + global_filters
222- value = FieldMixin.apply_filters(filters, value)
224+ value = FieldMixin.apply_filters(
225+ field_info.filters + global_filters
226+ if has_global_filters
227+ else field_info.filters,
228+ value
229+ )
223230
224231 if field_info.validators or has_global_validators:
225- validators = field_info.validators
226- if has_global_validators:
227- validators = validators + global_validators
228- result = FieldMixin.validate_field(
229- validators, field_info.fallback, value
230- )
231- if result is not None :
232- value = result
232+ value = FieldMixin.validate_field(
233+ field_info.validators + global_validators
234+ if has_global_validators
235+ else field_info.validators,
236+ field_info.fallback,
237+ value
238+ ) or value
233239
234240 if field_info.steps:
235- result = FieldMixin.apply_steps(
236- field_info.steps, field_info.fallback, value
237- )
238- if result is not None :
239- value = result
241+ value = FieldMixin.apply_steps(
242+ field_info.steps,
243+ field_info.fallback, value
244+ ) or value
240245
241246 if value is None :
242247 if field_info.required:
@@ -308,7 +313,15 @@ cdef class InputFilter:
308313 data to be filtered and stored.
309314 """
310315 self .data = {}
311- for field_name, field_value in data.items():
316+ cdef:
317+ int i = 0
318+ int n = len (data)
319+ list keys = list (data.keys())
320+ list values = list (data.values())
321+
322+ for i in range (n):
323+ field_name = keys[i]
324+ field_value = values[i]
312325 if field_name in self .fields:
313326 field_value = FieldMixin.apply_filters(
314327 filters = self .fields[field_name].filters + self .global_filters,
@@ -388,11 +401,17 @@ cdef class InputFilter:
388401 if not self .fields:
389402 return {}
390403
391- return {
392- field: self .data[field]
393- for field in self .fields
394- if field in self .data
395- }
404+ cdef:
405+ int i = 0
406+ int n = len (self .fields)
407+ dict result = {}
408+ list field_names = list (self .fields.keys())
409+
410+ for i in range (n):
411+ field = field_names[i]
412+ if field in self .data:
413+ result[field] = self .data[field]
414+ return result
396415
397416 cpdef dict get_unfiltered_data(self ):
398417 """
@@ -711,9 +730,14 @@ cdef class InputFilter:
711730 " Can only merge with another InputFilter instance."
712731 )
713732
714- for key, new_field in other.get_inputs().items():
715- self .fields[key] = new_field
733+ cdef:
734+ int i = 0
735+ int n = len (other.get_inputs())
736+ list keys = list (other.get_inputs().keys())
737+ list new_fields = list (other.get_inputs().values())
716738
739+ for i in range (n):
740+ self .fields[keys[i]] = new_fields[i]
717741 self .conditions += other.conditions
718742
719743 for filter in other.global_filters:
0 commit comments