{"record":{"id":"5d2e719948179002","repo":"pandas-dev/pandas","slug":"unary-addition-not-supported","errorCode":null,"errorMessage":"Unary addition not supported","messagePattern":"Unary addition not supported","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"pandas/core/computation/pytables.py","lineNumber":466,"sourceCode":"    term_type: ClassVar[type[Term]] = Term\n\n    def __init__(self, env, engine, parser, **kwargs) -> None:\n        super().__init__(env, engine, parser)\n        for bin_op in self.binary_ops:\n            bin_node = self.binary_op_nodes_map[bin_op]\n            setattr(\n                self,\n                f\"visit_{bin_node}\",\n                lambda node, bin_op=bin_op: partial(BinOp, bin_op, **kwargs),\n            )\n\n    def visit_UnaryOp(self, node, **kwargs) -> ops.Term | UnaryOp | None:\n        if isinstance(node.op, (ast.Not, ast.Invert)):\n            return UnaryOp(\"~\", self.visit(node.operand))\n        elif isinstance(node.op, ast.USub):\n            return self.const_type(-self.visit(node.operand).value, self.env)\n        elif isinstance(node.op, ast.UAdd):\n            raise NotImplementedError(\"Unary addition not supported\")\n        # TODO: return None might never be reached\n        return None\n\n    def visit_Index(self, node, **kwargs):\n        return self.visit(node.value).value\n\n    def visit_Assign(self, node, **kwargs):\n        cmpr = ast.Compare(\n            ops=[ast.Eq()], left=node.targets[0], comparators=[node.value]\n        )\n        return self.visit(cmpr)\n\n    def visit_Subscript(self, node, **kwargs) -> ops.Term:\n        # only allow simple subscripts\n\n        value = self.visit(node.value)\n        slobj = self.visit(node.slice)\n        try:","sourceCodeStart":448,"sourceCodeEnd":484,"githubUrl":"https://github.com/pandas-dev/pandas/blob/3b7651241d4da534b3559b60ef128e1c34f54116/pandas/core/computation/pytables.py#L448-L484","documentation":"Raised in PyTablesExprVisitor.visit_UnaryOp when node.op is an ast.UAdd — i.e. a unary plus such as '+A'. The visitor handles ast.Not/ast.Invert (mapped to '~'), and ast.USub (folded into a negated Constant), but unary addition has no meaningful effect on a filter condition and is explicitly unsupported, so it raises NotImplementedError.","triggerScenarios":"store.select('df', where='+A > 0'), store.select('df', where='+(+A) > 0'), or any where clause containing a unary '+' prefix on an operand.","commonSituations":"Copy-pasting an expression that used unary '+' for emphasis (e.g. SQL port). Auto-generated predicates that prepend '+' to numeric columns. Code generators that emit UAdd nodes unconditionally.","solutions":["Remove the unary '+' from the predicate: store.select('df', where='A > 0').","If the '+' comes from a code generator, strip leading '+' tokens before passing the where string.","Filter in pandas: df = store.get('df'); df[df['A'] > 0]."],"exampleFix":"// before\nstore.select('df', where='+A > 0')\n\n// after\nstore.select('df', where='A > 0')","handlingStrategy":"validation","validationCode":"import re\n\ndef where_has_unary_plus(where: str) -> bool:\n    return bool(re.search(r'(?<![\\w\\d)])\\+[A-Za-z_(]', where))\n\nassert not where_has_unary_plus(where_clause), 'unary + is not supported in HDFStore where clauses'","typeGuard":"def is_supported_unary_node(op_node) -> bool:\n    import ast\n    return isinstance(op_node, (ast.Not, ast.Invert, ast.USub))","tryCatchPattern":"try:\n    store.select('df', where='+A > 0')\nexcept NotImplementedError as e:\n    if 'Unary addition not supported' in str(e):\n        store.select('df', where='A > 0')\n    else:\n        raise","preventionTips":["Strip leading '+' tokens from generated where clauses.","Lint query strings for unary-plus prefixes.","Filter in pandas if '+' is semantically required."],"tags":["pandas","hdfstore","pytables","unary-operator","where"],"backgroundTag":null,"analyzedSha":"3b7651241d4da534b3559b60ef128e1c34f54116","analyzedAt":"2026-08-11T22:10:44.015Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}