mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-10-31 16:07:38 +03:00 
			
		
		
		
	Fix mutable default arguments in OrderingFilter methods (#9742)
* Install and configure flake8-bugbear to spot mutable default arguments
* Fix mutable default arguments in OrderingFilter methods
- Fixed get_default_valid_fields() and get_valid_fields() methods in filters.py
- Changed context={} default parameter to context=None to prevent mutable default anti-pattern
- Added proper None checking with context = {} assignment inside methods
Why this fix is important:
- Mutable default arguments (context={}) create shared state across function calls
- Same dict object gets reused, potentially causing unexpected side effects
- This is a well-known Python anti-pattern that can lead to bugs
What was changed:
- Line 249: get_default_valid_fields(self, queryset, view, context=None)
- Line 285: get_valid_fields(self, queryset, view, context=None)
- Added 'if context is None: context = {}' in both methods
Testing results:
- All existing filter tests pass (pytest tests/test_filters.py)
- Custom verification script confirms fix works correctly
- Maintains backward compatibility
- No breaking changes to API
Addresses GitHub issue #9741
---------
Co-authored-by: Bruno Alla <alla.brunoo@gmail.com>
			
			
This commit is contained in:
		
							parent
							
								
									ad0fea04de
								
							
						
					
					
						commit
						648ded9574
					
				|  | @ -18,6 +18,7 @@ repos: | ||||||
|   - id: flake8 |   - id: flake8 | ||||||
|     additional_dependencies: |     additional_dependencies: | ||||||
|     - flake8-tidy-imports |     - flake8-tidy-imports | ||||||
|  |     - flake8-bugbear | ||||||
| - repo: https://github.com/adamchainz/blacken-docs | - repo: https://github.com/adamchainz/blacken-docs | ||||||
|   rev: 1.20.0 |   rev: 1.20.0 | ||||||
|   hooks: |   hooks: | ||||||
|  |  | ||||||
|  | @ -249,7 +249,9 @@ class OrderingFilter(BaseFilterBackend): | ||||||
|             return (ordering,) |             return (ordering,) | ||||||
|         return ordering |         return ordering | ||||||
| 
 | 
 | ||||||
|     def get_default_valid_fields(self, queryset, view, context={}): |     def get_default_valid_fields(self, queryset, view, context=None): | ||||||
|  |         if context is None: | ||||||
|  |             context = {} | ||||||
|         # If `ordering_fields` is not specified, then we determine a default |         # If `ordering_fields` is not specified, then we determine a default | ||||||
|         # based on the serializer class, if one exists on the view. |         # based on the serializer class, if one exists on the view. | ||||||
|         if hasattr(view, 'get_serializer_class'): |         if hasattr(view, 'get_serializer_class'): | ||||||
|  | @ -286,7 +288,9 @@ class OrderingFilter(BaseFilterBackend): | ||||||
|             ) |             ) | ||||||
|         ] |         ] | ||||||
| 
 | 
 | ||||||
|     def get_valid_fields(self, queryset, view, context={}): |     def get_valid_fields(self, queryset, view, context=None): | ||||||
|  |         if context is None: | ||||||
|  |             context = {} | ||||||
|         valid_fields = getattr(view, 'ordering_fields', self.ordering_fields) |         valid_fields = getattr(view, 'ordering_fields', self.ordering_fields) | ||||||
| 
 | 
 | ||||||
|         if valid_fields is None: |         if valid_fields is None: | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user