mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-25 11:04:02 +03:00
Refactor: Replace try/except with contextlib.suppress() (#8676)
This commit is contained in:
parent
99cf2c415f
commit
c10f226622
|
@ -1,3 +1,4 @@
|
||||||
|
import contextlib
|
||||||
import copy
|
import copy
|
||||||
import datetime
|
import datetime
|
||||||
import decimal
|
import decimal
|
||||||
|
@ -690,15 +691,13 @@ class BooleanField(Field):
|
||||||
NULL_VALUES = {'null', 'Null', 'NULL', '', None}
|
NULL_VALUES = {'null', 'Null', 'NULL', '', None}
|
||||||
|
|
||||||
def to_internal_value(self, data):
|
def to_internal_value(self, data):
|
||||||
try:
|
with contextlib.suppress(TypeError):
|
||||||
if data in self.TRUE_VALUES:
|
if data in self.TRUE_VALUES:
|
||||||
return True
|
return True
|
||||||
elif data in self.FALSE_VALUES:
|
elif data in self.FALSE_VALUES:
|
||||||
return False
|
return False
|
||||||
elif data in self.NULL_VALUES and self.allow_null:
|
elif data in self.NULL_VALUES and self.allow_null:
|
||||||
return None
|
return None
|
||||||
except TypeError: # Input is an unhashable type
|
|
||||||
pass
|
|
||||||
self.fail('invalid', input=data)
|
self.fail('invalid', input=data)
|
||||||
|
|
||||||
def to_representation(self, value):
|
def to_representation(self, value):
|
||||||
|
@ -1158,19 +1157,14 @@ class DateTimeField(Field):
|
||||||
return self.enforce_timezone(value)
|
return self.enforce_timezone(value)
|
||||||
|
|
||||||
for input_format in input_formats:
|
for input_format in input_formats:
|
||||||
if input_format.lower() == ISO_8601:
|
with contextlib.suppress(ValueError, TypeError):
|
||||||
try:
|
if input_format.lower() == ISO_8601:
|
||||||
parsed = parse_datetime(value)
|
parsed = parse_datetime(value)
|
||||||
if parsed is not None:
|
if parsed is not None:
|
||||||
return self.enforce_timezone(parsed)
|
return self.enforce_timezone(parsed)
|
||||||
except (ValueError, TypeError):
|
|
||||||
pass
|
parsed = self.datetime_parser(value, input_format)
|
||||||
else:
|
return self.enforce_timezone(parsed)
|
||||||
try:
|
|
||||||
parsed = self.datetime_parser(value, input_format)
|
|
||||||
return self.enforce_timezone(parsed)
|
|
||||||
except (ValueError, TypeError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
humanized_format = humanize_datetime.datetime_formats(input_formats)
|
humanized_format = humanize_datetime.datetime_formats(input_formats)
|
||||||
self.fail('invalid', format=humanized_format)
|
self.fail('invalid', format=humanized_format)
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
Pagination serializers determine the structure of the output that should
|
Pagination serializers determine the structure of the output that should
|
||||||
be used for paginated responses.
|
be used for paginated responses.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import contextlib
|
||||||
from base64 import b64decode, b64encode
|
from base64 import b64decode, b64encode
|
||||||
from collections import OrderedDict, namedtuple
|
from collections import OrderedDict, namedtuple
|
||||||
from urllib import parse
|
from urllib import parse
|
||||||
|
@ -257,15 +259,12 @@ class PageNumberPagination(BasePagination):
|
||||||
|
|
||||||
def get_page_size(self, request):
|
def get_page_size(self, request):
|
||||||
if self.page_size_query_param:
|
if self.page_size_query_param:
|
||||||
try:
|
with contextlib.suppress(KeyError, ValueError):
|
||||||
return _positive_int(
|
return _positive_int(
|
||||||
request.query_params[self.page_size_query_param],
|
request.query_params[self.page_size_query_param],
|
||||||
strict=True,
|
strict=True,
|
||||||
cutoff=self.max_page_size
|
cutoff=self.max_page_size
|
||||||
)
|
)
|
||||||
except (KeyError, ValueError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
return self.page_size
|
return self.page_size
|
||||||
|
|
||||||
def get_next_link(self):
|
def get_next_link(self):
|
||||||
|
@ -430,15 +429,12 @@ class LimitOffsetPagination(BasePagination):
|
||||||
|
|
||||||
def get_limit(self, request):
|
def get_limit(self, request):
|
||||||
if self.limit_query_param:
|
if self.limit_query_param:
|
||||||
try:
|
with contextlib.suppress(KeyError, ValueError):
|
||||||
return _positive_int(
|
return _positive_int(
|
||||||
request.query_params[self.limit_query_param],
|
request.query_params[self.limit_query_param],
|
||||||
strict=True,
|
strict=True,
|
||||||
cutoff=self.max_limit
|
cutoff=self.max_limit
|
||||||
)
|
)
|
||||||
except (KeyError, ValueError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
return self.default_limit
|
return self.default_limit
|
||||||
|
|
||||||
def get_offset(self, request):
|
def get_offset(self, request):
|
||||||
|
@ -680,15 +676,12 @@ class CursorPagination(BasePagination):
|
||||||
|
|
||||||
def get_page_size(self, request):
|
def get_page_size(self, request):
|
||||||
if self.page_size_query_param:
|
if self.page_size_query_param:
|
||||||
try:
|
with contextlib.suppress(KeyError, ValueError):
|
||||||
return _positive_int(
|
return _positive_int(
|
||||||
request.query_params[self.page_size_query_param],
|
request.query_params[self.page_size_query_param],
|
||||||
strict=True,
|
strict=True,
|
||||||
cutoff=self.max_page_size
|
cutoff=self.max_page_size
|
||||||
)
|
)
|
||||||
except (KeyError, ValueError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
return self.page_size
|
return self.page_size
|
||||||
|
|
||||||
def get_next_link(self):
|
def get_next_link(self):
|
||||||
|
|
|
@ -4,7 +4,9 @@ Parsers are used to parse the content of incoming HTTP requests.
|
||||||
They give us a generic way of being able to handle various media types
|
They give us a generic way of being able to handle various media types
|
||||||
on the request, such as form content or json encoded data.
|
on the request, such as form content or json encoded data.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import codecs
|
import codecs
|
||||||
|
import contextlib
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.files.uploadhandler import StopFutureHandlers
|
from django.core.files.uploadhandler import StopFutureHandlers
|
||||||
|
@ -193,17 +195,12 @@ class FileUploadParser(BaseParser):
|
||||||
Detects the uploaded file name. First searches a 'filename' url kwarg.
|
Detects the uploaded file name. First searches a 'filename' url kwarg.
|
||||||
Then tries to parse Content-Disposition header.
|
Then tries to parse Content-Disposition header.
|
||||||
"""
|
"""
|
||||||
try:
|
with contextlib.suppress(KeyError):
|
||||||
return parser_context['kwargs']['filename']
|
return parser_context['kwargs']['filename']
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
try:
|
with contextlib.suppress(AttributeError, KeyError, ValueError):
|
||||||
meta = parser_context['request'].META
|
meta = parser_context['request'].META
|
||||||
disposition, params = parse_header_parameters(meta['HTTP_CONTENT_DISPOSITION'])
|
disposition, params = parse_header_parameters(meta['HTTP_CONTENT_DISPOSITION'])
|
||||||
if 'filename*' in params:
|
if 'filename*' in params:
|
||||||
return params['filename*']
|
return params['filename*']
|
||||||
else:
|
return params['filename']
|
||||||
return params['filename']
|
|
||||||
except (AttributeError, KeyError, ValueError):
|
|
||||||
pass
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import contextlib
|
||||||
import sys
|
import sys
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from urllib import parse
|
from urllib import parse
|
||||||
|
@ -170,7 +171,7 @@ class RelatedField(Field):
|
||||||
def get_attribute(self, instance):
|
def get_attribute(self, instance):
|
||||||
if self.use_pk_only_optimization() and self.source_attrs:
|
if self.use_pk_only_optimization() and self.source_attrs:
|
||||||
# Optimized case, return a mock object only containing the pk attribute.
|
# Optimized case, return a mock object only containing the pk attribute.
|
||||||
try:
|
with contextlib.suppress(AttributeError):
|
||||||
attribute_instance = get_attribute(instance, self.source_attrs[:-1])
|
attribute_instance = get_attribute(instance, self.source_attrs[:-1])
|
||||||
value = attribute_instance.serializable_value(self.source_attrs[-1])
|
value = attribute_instance.serializable_value(self.source_attrs[-1])
|
||||||
if is_simple_callable(value):
|
if is_simple_callable(value):
|
||||||
|
@ -183,9 +184,6 @@ class RelatedField(Field):
|
||||||
value = getattr(value, 'pk', value)
|
value = getattr(value, 'pk', value)
|
||||||
|
|
||||||
return PKOnlyObject(pk=value)
|
return PKOnlyObject(pk=value)
|
||||||
except AttributeError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Standard case, return the object instance.
|
# Standard case, return the object instance.
|
||||||
return super().get_attribute(instance)
|
return super().get_attribute(instance)
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,9 @@ on the response, such as JSON encoded data or HTML output.
|
||||||
|
|
||||||
REST framework also provides an HTML renderer that renders the browsable API.
|
REST framework also provides an HTML renderer that renders the browsable API.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import base64
|
import base64
|
||||||
|
import contextlib
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from urllib import parse
|
from urllib import parse
|
||||||
|
|
||||||
|
@ -72,11 +74,8 @@ class JSONRenderer(BaseRenderer):
|
||||||
# then pretty print the result.
|
# then pretty print the result.
|
||||||
# Note that we coerce `indent=0` into `indent=None`.
|
# Note that we coerce `indent=0` into `indent=None`.
|
||||||
base_media_type, params = parse_header_parameters(accepted_media_type)
|
base_media_type, params = parse_header_parameters(accepted_media_type)
|
||||||
try:
|
with contextlib.suppress(KeyError, ValueError, TypeError):
|
||||||
return zero_as_none(max(min(int(params['indent']), 8), 0))
|
return zero_as_none(max(min(int(params['indent']), 8), 0))
|
||||||
except (KeyError, ValueError, TypeError):
|
|
||||||
pass
|
|
||||||
|
|
||||||
# If 'indent' is provided in the context, then pretty print the result.
|
# If 'indent' is provided in the context, then pretty print the result.
|
||||||
# E.g. If we're being called by the BrowsableAPIRenderer.
|
# E.g. If we're being called by the BrowsableAPIRenderer.
|
||||||
return renderer_context.get('indent', None)
|
return renderer_context.get('indent', None)
|
||||||
|
@ -488,11 +487,8 @@ class BrowsableAPIRenderer(BaseRenderer):
|
||||||
return
|
return
|
||||||
|
|
||||||
if existing_serializer is not None:
|
if existing_serializer is not None:
|
||||||
try:
|
with contextlib.suppress(TypeError):
|
||||||
return self.render_form_for_serializer(existing_serializer)
|
return self.render_form_for_serializer(existing_serializer)
|
||||||
except TypeError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
if has_serializer:
|
if has_serializer:
|
||||||
if method in ('PUT', 'PATCH'):
|
if method in ('PUT', 'PATCH'):
|
||||||
serializer = view.get_serializer(instance=instance, **kwargs)
|
serializer = view.get_serializer(instance=instance, **kwargs)
|
||||||
|
|
|
@ -10,6 +10,8 @@ python primitives.
|
||||||
2. The process of marshalling between python primitives and request and
|
2. The process of marshalling between python primitives and request and
|
||||||
response content is handled by parsers and renderers.
|
response content is handled by parsers and renderers.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import contextlib
|
||||||
import copy
|
import copy
|
||||||
import inspect
|
import inspect
|
||||||
import traceback
|
import traceback
|
||||||
|
@ -1496,12 +1498,10 @@ class ModelSerializer(Serializer):
|
||||||
# they can't be nested attribute lookups.
|
# they can't be nested attribute lookups.
|
||||||
continue
|
continue
|
||||||
|
|
||||||
try:
|
with contextlib.suppress(FieldDoesNotExist):
|
||||||
field = model._meta.get_field(source)
|
field = model._meta.get_field(source)
|
||||||
if isinstance(field, DjangoModelField):
|
if isinstance(field, DjangoModelField):
|
||||||
model_fields[source] = field
|
model_fields[source] = field
|
||||||
except FieldDoesNotExist:
|
|
||||||
pass
|
|
||||||
|
|
||||||
return model_fields
|
return model_fields
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
"""
|
"""
|
||||||
Helper classes for parsers.
|
Helper classes for parsers.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import contextlib
|
||||||
import datetime
|
import datetime
|
||||||
import decimal
|
import decimal
|
||||||
import json # noqa
|
import json # noqa
|
||||||
|
@ -58,10 +60,8 @@ class JSONEncoder(json.JSONEncoder):
|
||||||
)
|
)
|
||||||
elif hasattr(obj, '__getitem__'):
|
elif hasattr(obj, '__getitem__'):
|
||||||
cls = (list if isinstance(obj, (list, tuple)) else dict)
|
cls = (list if isinstance(obj, (list, tuple)) else dict)
|
||||||
try:
|
with contextlib.suppress(Exception):
|
||||||
return cls(obj)
|
return cls(obj)
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
elif hasattr(obj, '__iter__'):
|
elif hasattr(obj, '__iter__'):
|
||||||
return tuple(item for item in obj)
|
return tuple(item for item in obj)
|
||||||
return super().default(obj)
|
return super().default(obj)
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import contextlib
|
||||||
import sys
|
import sys
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from collections.abc import Mapping, MutableMapping
|
from collections.abc import Mapping, MutableMapping
|
||||||
|
@ -103,15 +104,13 @@ class JSONBoundField(BoundField):
|
||||||
# When HTML form input is used and the input is not valid
|
# When HTML form input is used and the input is not valid
|
||||||
# value will be a JSONString, rather than a JSON primitive.
|
# value will be a JSONString, rather than a JSON primitive.
|
||||||
if not getattr(value, 'is_json_string', False):
|
if not getattr(value, 'is_json_string', False):
|
||||||
try:
|
with contextlib.suppress(TypeError, ValueError):
|
||||||
value = json.dumps(
|
value = json.dumps(
|
||||||
self.value,
|
self.value,
|
||||||
sort_keys=True,
|
sort_keys=True,
|
||||||
indent=4,
|
indent=4,
|
||||||
separators=(',', ': '),
|
separators=(',', ': '),
|
||||||
)
|
)
|
||||||
except (TypeError, ValueError):
|
|
||||||
pass
|
|
||||||
return self.__class__(self._field, value, self.errors, self._prefix)
|
return self.__class__(self._field, value, self.errors, self._prefix)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user