{"record":{"id":"6a2174a2b83dec2b","repo":"python/cpython","slug":"string-is-expected","errorCode":null,"errorMessage":"string is expected","messagePattern":"string is expected","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"Lib/asyncio/base_events.py","lineNumber":1420,"sourceCode":"                opts = dict(local_addr=local_addr, remote_addr=remote_addr,\n                            family=family, proto=proto, flags=flags,\n                            reuse_port=reuse_port,\n                            allow_broadcast=allow_broadcast)\n                problems = ', '.join(f'{k}={v}' for k, v in opts.items() if v)\n                raise ValueError(\n                    f'socket modifier keyword arguments can not be used '\n                    f'when sock is specified. ({problems})')\n            sock.setblocking(False)\n            r_addr = None\n        else:\n            if not (local_addr or remote_addr):\n                if family == 0:\n                    raise ValueError('unexpected address family')\n                addr_pairs_info = (((family, proto), (None, None)),)\n            elif hasattr(socket, 'AF_UNIX') and family == socket.AF_UNIX:\n                for addr in (local_addr, remote_addr):\n                    if addr is not None and not isinstance(addr, str):\n                        raise TypeError('string is expected')\n\n                if local_addr and local_addr[0] not in (0, '\\x00'):\n                    try:\n                        if stat.S_ISSOCK(os.stat(local_addr).st_mode):\n                            os.remove(local_addr)\n                    except FileNotFoundError:\n                        pass\n                    except OSError as err:\n                        # Directory may have permissions only to create socket.\n                        logger.error('Unable to check or remove stale UNIX '\n                                     'socket %r: %r',\n                                     local_addr, err)\n\n                addr_pairs_info = (((family, proto),\n                                    (local_addr, remote_addr)), )\n            else:\n                # join address by (family, protocol)\n                addr_infos = {}  # Using order preserving dict","sourceCodeStart":1402,"sourceCodeEnd":1438,"githubUrl":"https://github.com/python/cpython/blob/bc6749cc3b5ae4a5e88a6cc2d5b3bebbe354eae6/Lib/asyncio/base_events.py#L1402-L1438","documentation":"Raised by create_datagram_endpoint() when family is AF_UNIX but local_addr or remote_addr is not a plain string. UNIX-domain datagram addresses are filesystem paths, so both must be str (or None), unlike INET where they are (host, port) tuples.","triggerScenarios":"loop.create_datagram_endpoint(factory, family=socket.AF_UNIX, remote_addr=('127.0.0.1', 9000)) — passing an INET-style tuple, bytes, or any non-str object as an AF_UNIX address.","commonSituations":"Porting INET code to UNIX sockets and leaving the tuple addresses in place; passing a pathlib.Path instead of str(path).","solutions":["Use string paths: remote_addr='/tmp/app.sock'","Convert pathlib.Path with str(path) before passing","Drop family=AF_UNIX if you actually meant TCP-style (host, port) addressing"],"exampleFix":"# before\nawait loop.create_datagram_endpoint(factory, family=socket.AF_UNIX, remote_addr=Path('/tmp/app.sock'))\n\n# after\nawait loop.create_datagram_endpoint(factory, family=socket.AF_UNIX, remote_addr='/tmp/app.sock')","handlingStrategy":"type-guard","validationCode":"if family == socket.AF_UNIX:\n    local_addr = str(local_addr) if local_addr is not None else None\n    remote_addr = str(remote_addr) if remote_addr is not None else None","typeGuard":"def is_unix_datagram_addr(a) -> TypeGuard[str | None]:\n    return a is None or isinstance(a, str)","tryCatchPattern":null,"preventionTips":["Store UNIX socket paths as str in config, converting pathlib.Path at the boundary","Remember AF_UNIX addresses are paths, not (host, port) tuples"],"tags":["asyncio","unix-socket","datagram","type-error"],"backgroundTag":null,"analyzedSha":"bc6749cc3b5ae4a5e88a6cc2d5b3bebbe354eae6","analyzedAt":"2026-08-14T22:01:13.976Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}