New submission from Nick Coghlan <ncogh...@gmail.com>:

While working on the PEP 642 reference implementation I removed the "default:" 
case from the switch statement in astfold_expr as part of making sure the new 
SkippedBinding node was being handled everywhere it needed to be.

This change picked up that NamedExpr_kind wasn't being handled either, and a 
check with the dis module confirmed that using the walrus operator turns off 
constant folding:

```
[ncoghlan@thechalk cpython]$ ./python
Python 3.10.0a2+ (heads/pep-642-constraint-patterns-dirty:4db2fbd609, Nov  7 
2020, 16:42:19) 
[GCC 10.2.1 20201016 (Red Hat 10.2.1-6)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis
>>> dis.dis("1 + 1")
  1           0 LOAD_CONST               0 (2)
              2 RETURN_VALUE
>>> dis.dis("(x := 1 + 1)")
  1           0 LOAD_CONST               0 (1)
              2 LOAD_CONST               0 (1)
              4 BINARY_ADD
              6 DUP_TOP
              8 STORE_NAME               0 (x)
             10 RETURN_VALUE
>>>
```

The missing switch statement entry is just:

```
    case NamedExpr_kind:
        CALL(astfold_expr, expr_ty, node_->v.NamedExpr.value);
        break;
```

Which gives the expected result:

```
[ncoghlan@thechalk cpython]$ ./python -c "import dis; dis.dis('(x := 1 +1)')"
  1           0 LOAD_CONST               0 (2)
              2 DUP_TOP
              4 STORE_NAME               0 (x)
              6 RETURN_VALUE
```

----------
messages: 380494
nosy: ncoghlan
priority: normal
severity: normal
stage: needs patch
status: open
title: Constant folding is skipped in named expressions
type: performance
versions: Python 3.10

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue42282>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to