{"record":{"id":"7a4043cf4180647b","repo":"python/cpython","slug":"node-can-t-be-used-without-a-value-attribute","errorCode":null,"errorMessage":"Node can't be used without a value attribute.","messagePattern":"Node can't be used without a value attribute\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"warning","filePath":"Lib/_ast_unparse.py","lineNumber":333,"sourceCode":"            self.write(\"await\")\n            if node.value:\n                self.write(\" \")\n                self.set_precedence(_Precedence.ATOM, node.value)\n                self.traverse(node.value)\n\n    def visit_Yield(self, node):\n        with self.require_parens(_Precedence.YIELD, node):\n            self.write(\"yield\")\n            if node.value:\n                self.write(\" \")\n                self.set_precedence(_Precedence.ATOM, node.value)\n                self.traverse(node.value)\n\n    def visit_YieldFrom(self, node):\n        with self.require_parens(_Precedence.YIELD, node):\n            self.write(\"yield from \")\n            if not node.value:\n                raise ValueError(\"Node can't be used without a value attribute.\")\n            self.set_precedence(_Precedence.ATOM, node.value)\n            self.traverse(node.value)\n\n    def visit_Raise(self, node):\n        self.fill(\"raise\")\n        if not node.exc:\n            if node.cause:\n                raise ValueError(f\"Node can't use cause without an exception.\")\n            return\n        self.write(\" \")\n        self.traverse(node.exc)\n        if node.cause:\n            self.write(\" from \")\n            self.traverse(node.cause)\n\n    def do_visit_try(self, node):\n        self.fill(\"try\", allow_semicolon=False)\n        with self.block():","sourceCodeStart":315,"sourceCodeEnd":351,"githubUrl":"https://github.com/python/cpython/blob/bc6749cc3b5ae4a5e88a6cc2d5b3bebbe354eae6/Lib/_ast_unparse.py#L315-L351","documentation":"Debug-mode guard in BaseSelectorEventLoop.sock_accept(): before scheduling an asynchronous accept, the loop requires the listening socket to be non-blocking. With debug mode on and a nonzero/None timeout on the socket, the call raises ValueError instead of risking a blocking accept() that would freeze the loop.","triggerScenarios":"await loop.sock_accept(listen_sock) with debug mode enabled while the listening socket was created blocking (default) or carries a timeout — a very common oversight since listening sockets are often created in plain sync startup code before the loop runs.","commonSituations":"Servers whose listen socket setup code predates the asyncio port and never calls setblocking(False); tests with debug enabled rejecting previously-working servers; wrappers that set a timeout on the listener to bound startup races.","solutions":["Call listen_sock.setblocking(False) right after bind()/listen()","Build the listener inside async startup (e.g. loop.run_until_complete(start())) where non-blocking is set consistently","For accept timeouts, wrap with asyncio.wait_for rather than socket timeouts"],"exampleFix":"# before\nsrv = socket.socket(); srv.bind(addr); srv.listen()\nawait loop.sock_accept(srv)  # debug: ValueError\n# after\nsrv = socket.socket(); srv.bind(addr); srv.listen()\nsrv.setblocking(False)\nawait loop.sock_accept(srv)","handlingStrategy":"validation","validationCode":"srv = socket.socket()\nsrv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)\nsrv.bind(addr)\nsrv.listen(128)\nsrv.setblocking(False)               # before loop use\n\nconn, peer = await loop.sock_accept(srv)","typeGuard":null,"tryCatchPattern":"try:\n    await loop.sock_accept(srv)\nexcept ValueError as e:\n    if 'non-blocking' in str(e):\n        srv.setblocking(False)\n        return await loop.sock_accept(srv)\n    raise","preventionTips":["Set listeners non-blocking right after listen()","Bound accept with wait_for instead of socket timeouts","Do listener setup inside async startup code","Verify gettimeout() == 0 in server smoke tests"],"tags":["asyncio","socket","server","debug-mode","accept"],"backgroundTag":null,"analyzedSha":"bc6749cc3b5ae4a5e88a6cc2d5b3bebbe354eae6","analyzedAt":"2026-08-14T22:01:13.976Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}