Summary
Split the signed numeric pattern closure from #8954 onto validated base cf56c1fa09654507939aac5f47be5e5692e1dce0.
- Validate numeric
ast.Constant operands using their existing canonical representation, while retaining parser-produced numeric literal handling.
- Accept and fold
UAdd as well as USub for numeric match values and mapping keys, including signed real parts of complex literals.
- Keep booleans and nonnumeric values excluded from numeric operands.
The representation adaptation matters: Python AST conversion now produces Expr::Constant, while the old signed-number validator accepted only Expr::NumberLiteral. Merely copying the mega's unary-plus hunks still rejects valid manual ASTs, including unary minus.
No Lib changes, parser pin changes, new Rust tests of Python behavior, or duplicated snippets. No Ruff #7 or #9074 overlap. Redundant lazy-future and type-alias changes from the mega are deliberately excluded because current main already supplies those behaviors.
Validation
- External bounded differential observations: 24 valid manual-AST patterns (unary plus/minus on integers, floats and complex constants; signed-real complex expressions; match values and mapping keys), each checked for matching/nonmatching behavior. Baseline rejects all24; revised candidate matches CPython for all24. The minimal mega changes alone still reject all24, confirming the representation adaptation is required.
- Three existing canonical selectors passed independently on baseline, candidate and CPython: two AST folding controls and one lazy-future compatibility control. Nine runs, zero skips. Selected methods match canonical CPython source.
- Eleven bounded ordinary-source compile/parse observations remain identical to baseline and CPython; these are controls, not new fixes.
- Fresh source-bound CLI build and strict codegen/VM all-target Clippy passed.
- Workspace test compilation (
--no-run, excluding wasm/venvlauncher/CAPI) and separate CAPI test compilation passed. These are compile-only checks, not full runtime-suite results.
- Configured pre-commit hooks passed, including the normal commit hook; no bypasses.
Reference
CPython 3.15.0 source pin d220409a13b77de7a6c30abe16ea90db01528edc: numeric/signed validation and match-pattern folding.
AI-assisted implementation and validation with OpenAI Codex; exact model version unavailable. No merge requested.
Performance follow-up
The exact-head hosted checks completed with 17 successes, three conditional skips and one unresolved CodSpeed failure. CodSpeed actually measured comprehension_list.py: 804.5 → 913.4 µs (−11.93% efficiency), comparing main 2be9389 against tested merge 8c91234; baseline and head environment signatures, runner and kernel versions matched.
A separately reviewed, fixed native experiment used that exact source pair and the unchanged benchmark: 12 ABBA blocks, 48 fresh processes, one selector and all observations retained. Candidate time changed −0.087%, with a descriptive 95% block-bootstrap interval of −3.666% to +3.856%. Same-binary variability was substantial. This local native result does not establish equivalence, reproduce CodSpeed simulation or explain its failure; the host and embedded build metadata differ from CI. Static hot-path inspection found equal selected instruction shapes but different layouts, not proof of causation. The quiet intervals were coordinated through explicit heavy-work release, but the process guard was PID-namespace-local and could not verify absence of contention from other executions or the host.
The first excluded smoke stopped on a compatibility-URI validation mismatch. A source-reviewed schema correction preceded a new attempt with the unchanged schedule; neither smoke attempt entered the estimate. No hosted benchmark rerun, performance dismissal, simulation setup or security-setting change was performed. The failed CodSpeed check remains visible.