{"record":{"id":"be52fdb2f1eee9e6","repo":"python/cpython","slug":"data-argument-must-be-a-bytes-like-object-not-ty-be52fd","errorCode":null,"errorMessage":"data argument must be a bytes-like object, not {type(data).__name__!r}","messagePattern":"data argument must be a bytes-like object, not (.+?)","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"Lib/asyncio/selector_events.py","lineNumber":1274,"sourceCode":"    def _read_ready(self):\n        if self._conn_lost:\n            return\n        try:\n            data, addr = self._sock.recvfrom(self.max_size)\n        except (BlockingIOError, InterruptedError):\n            pass\n        except OSError as exc:\n            self._protocol.error_received(exc)\n        except (SystemExit, KeyboardInterrupt):\n            raise\n        except BaseException as exc:\n            self._fatal_error(exc, 'Fatal read error on datagram transport')\n        else:\n            self._protocol.datagram_received(data, addr)\n\n    def sendto(self, data, addr=None):\n        if not isinstance(data, (bytes, bytearray, memoryview)):\n            raise TypeError(f'data argument must be a bytes-like object, '\n                            f'not {type(data).__name__!r}')\n\n        if self._address:\n            if addr not in (None, self._address):\n                raise ValueError(\n                    f'Invalid address: must be None or {self._address}')\n            addr = self._address\n\n        if self._conn_lost and self._address:\n            if self._conn_lost >= constants.LOG_THRESHOLD_FOR_CONNLOST_WRITES:\n                logger.warning('socket.send() raised exception.')\n            self._conn_lost += 1\n            return\n\n        if not self._buffer:\n            # Attempt to send it right away first.\n            try:\n                if self._extra['peername']:","sourceCodeStart":1256,"sourceCodeEnd":1292,"githubUrl":"https://github.com/python/cpython/blob/bc6749cc3b5ae4a5e88a6cc2d5b3bebbe354eae6/Lib/asyncio/selector_events.py#L1256-L1292","documentation":"Raised by _SelectorDatagramTransport.sendto() as TypeError when the data argument is not bytes, bytearray, or memoryview. Datagram transports exchange raw binary payloads only; strings and other sequence types are rejected at the boundary rather than encoded implicitly.","triggerScenarios":"transport.sendto('hello', addr) or protocol-level code calling the datagram transport's sendto() with a str, int, list, or custom object; reached via DatagramProtocol through loop.create_datagram_endpoint().","commonSituations":"Porting UDP code from a framework whose send() accepted str (e.g. some websocket/ZMQ wrappers); forgetting json.dumps(...).encode() when sending JSON datagrams; passing a pre-serialized object that is not yet bytes.","solutions":["Encode all payloads: transport.sendto(msg.encode('utf-8'), addr).","Serialize explicitly before sending: transport.sendto(json.dumps(obj).encode(), addr) or struct.pack(...).","Centralize encoding in a small send helper that type-checks before calling sendto()."],"exampleFix":"// before\ntransport.sendto(json.dumps({\"cmd\": \"ping\"}), addr)  # str -> TypeError\n\n// after\ntransport.sendto(json.dumps({\"cmd\": \"ping\"}).encode(), addr)","handlingStrategy":"type-guard","validationCode":"def udp_payload(data):\n    if isinstance(data, str):\n        return data.encode('utf-8')\n    if not isinstance(data, (bytes, bytearray, memoryview)):\n        raise TypeError(f'cannot send {type(data).__name__} as datagram')\n    return data\n\ntransport.sendto(udp_payload(msg), addr)","typeGuard":"BytesLike = (bytes, bytearray, memoryview)\n\ndef is_datagram_payload(data) -> bool:\n    return isinstance(data, BytesLike)","tryCatchPattern":"try:\n    transport.sendto(data, addr)\nexcept TypeError as e:\n    if 'bytes-like' in str(e):\n        transport.sendto(str(data).encode(), addr)\n    else:\n        raise","preventionTips":["Encode to bytes before building datagrams; keep payloads bytes end-to-end.","Annotate send helpers with `data: bytes` and check with mypy.","Remember str is never implicitly encoded by asyncio transports."],"tags":["asyncio","networking","udp","typeerror","datagram"],"backgroundTag":null,"analyzedSha":"bc6749cc3b5ae4a5e88a6cc2d5b3bebbe354eae6","analyzedAt":"2026-08-14T22:01:13.976Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}