python / python/cpython

ast.parse creates only Constant(value=0) nodes for a `case +0:` pattern, which is inconsistent.

Aberta
#152,708 1 comentário 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

interpreter-core topic-parser type-bug
Linguagem predominante
Python
Estrelas
77.2k
Forks
36k
Métricas de merge de PRs
Métricas de PR pendentes

Descrição

Bug report

Bug description:

I found the following asymmetry in the generated ast while I was working with the new cpython 3.15.

c="""
match 0:
    case +0:
        pass
    case -0:
        pass
+0
-0
"""

import ast

print(ast.dump(ast.parse(c),indent=2))

output (Python 3.15.0b3+dev):

Module(
  body=[
    Match(
      subject=Constant(value=0),
      cases=[
        match_case(
          pattern=MatchValue(
            value=Constant(value=0)),
          body=[
            Pass()]),
        match_case(
          pattern=MatchValue(
            value=UnaryOp(
              op=USub(),
              operand=Constant(value=0))),
          body=[
            Pass()])]),
    Expr(
      value=UnaryOp(
        op=UAdd(),
        operand=Constant(value=0))),
    Expr(
      value=UnaryOp(
        op=USub(),
        operand=Constant(value=0)))])

+0 is parsed to Constant(value=0) instead of UnaryOp(op=UAdd(),operand=Constant(value=0)) when it is used as a match-expression.

This was really unexpected for me and can maybe produce some problems with ast.parse/unparse roundtripps or code which works with the ast and require workarounds (like in my case)

Is it possible to implement this in a way that it generates UnaryOp(...)?

@johnslavik you implemented this #148566, maybe you can help me here.

CPython versions tested on:

3.15

Operating systems tested on:

No response

Linked PRs
  • gh-152712

Guia de contribuição

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Direção de pesquisa

Comece com o exemplo de ast.parse na issue e compare os nós gerados para case +0:, case -0:, +0 e -0. Rastreie como o match-expression é representado, depois faça com que o padrão +0 produza a forma UnaryOp esperada e verifique a saída da AST e o round trip de ast.parse/unparse.

Escrita pelo modelo de indexação a partir do texto da issue.

Avaliação

Stack de tecnologia
python
Domínio
compilers
Tipo de issue
Bug
Dificuldade
3/5
Tempo estimado
1-2 dias
Status de atividade
Estagnada
Clareza
Razoavelmente clara
Facilidade para iniciantes
35/100

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.