mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-11-01 00:17:40 +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