{"id":"c6acedf2576d2cf6","repo":"boto/boto3","slug":"infinity-and-nan-not-supported","errorCode":null,"errorMessage":"Infinity and NaN not supported","messagePattern":"Infinity and NaN not supported","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"boto3/dynamodb/types.py","lineNumber":216,"sourceCode":"        if isinstance(value, collections_abc.Mapping):\n            return True\n        return False\n\n    def _is_listlike(self, value):\n        if isinstance(value, (list, tuple)):\n            return True\n        return False\n\n    def _serialize_null(self, value):\n        return True\n\n    def _serialize_bool(self, value):\n        return value\n\n    def _serialize_n(self, value):\n        number = str(DYNAMODB_CONTEXT.create_decimal(value))\n        if number in ['Infinity', 'NaN']:\n            raise TypeError('Infinity and NaN not supported')\n        return number\n\n    def _serialize_s(self, value):\n        return value\n\n    def _serialize_b(self, value):\n        if isinstance(value, Binary):\n            value = value.value\n        return value\n\n    def _serialize_ss(self, value):\n        return [self._serialize_s(s) for s in value]\n\n    def _serialize_ns(self, value):\n        return [self._serialize_n(n) for n in value]\n\n    def _serialize_bs(self, value):\n        return [self._serialize_b(b) for b in value]","sourceCodeStart":198,"sourceCodeEnd":234,"githubUrl":"https://github.com/boto/boto3/blob/c7b4afac237b976d48395d7523eaf7cec3a450b3/boto3/dynamodb/types.py#L198-L234","documentation":"Raised by TypeSerializer._serialize_n after converting a number to a Decimal via DYNAMODB_CONTEXT.create_decimal(value). If the resulting decimal stringifies to 'Infinity' or 'NaN' (e.g. Decimal('Infinity'), Decimal('NaN'), or an operation that overflows), the serializer refuses it because DynamoDB does not support Infinity or NaN numeric values.","triggerScenarios":"table.put_item(Item={'x': Decimal('Infinity')}) or Decimal('NaN'). Also computing a division that yields Infinity under the DYNAMODB_CONTEXT (which traps Overflow), or passing Decimal('Inf').","commonSituations":"Aggregations that divide by zero producing Infinity; ingesting data from sources that emit NaN; using Decimal arithmetic with special values.","solutions":["Filter out Infinity/NaN before writing: if value.is_finite(): ....","Replace non-finite values with None or a sentinel Decimal.","Validate upstream data to prevent NaN/Infinity from reaching DynamoDB."],"exampleFix":"# before\nfrom decimal import Decimal\ntable.put_item(Item={'ratio': Decimal('Infinity')})\n\n# after\nfrom decimal import Decimal\nval = Decimal('Infinity')\nval = val if val.is_finite() else None\ntable.put_item(Item={'ratio': val})","handlingStrategy":"validation","validationCode":"from decimal import Decimal\n\ndef safe_decimal(value):\n    d = Decimal(value) if not isinstance(value, Decimal) else value\n    if not d.is_finite():\n        raise ValueError(f'Non-finite decimal not allowed: {d}')\n    return d\n\ndef normalize_numbers(item):\n    return {k: (safe_decimal(v) if isinstance(v, Decimal) else v) for k, v in item.items()}","typeGuard":"from decimal import Decimal\n\ndef is_finite_decimal(v) -> bool:\n    return isinstance(v, Decimal) and v.is_finite()","tryCatchPattern":null,"preventionTips":["Check value.is_finite() on every Decimal before writing to DynamoDB.","Sanitize upstream numeric feeds to convert NaN/Infinity to None.","Wrap DynamoDB writes in a normalizer that rejects non-finite decimals."],"tags":["dynamodb","types","decimal","infinity","nan","serialization"],"analyzedSha":"c7b4afac237b976d48395d7523eaf7cec3a450b3","analyzedAt":"2026-08-04T20:35:51.598Z","schemaVersion":2}