Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

Expose the parsed expression tree from Program (for explain/trace tooling, linting and sub-expression evaluation)

Ouverte
#48 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Personne n'a encore pris cette issue.

Évaluation

Difficulté
5/5
Temps estimé
Plus d'une semaine
Accessibilité débutants
45/100
Type d'issue
Fonctionnalité
Clarté
Plutôt claire
Activité
Active
Stack technique
python, rust

Piste de recherche

Commencez par inspecter le wrapper Python Program et cel::Program::expression(), puis comparez ses variantes IdedExpr et Expr avec l’arbre proposé sérialisable en JSON. C’est terminé lorsque Program.ast() expose les littéraux, les identifiants, les selects, les appels, les listes, les maps, les structs et les comprehensions développées, avec une documentation provisoire liée à la version de cel-rust.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

enhancement

Motivation

Program.references() answers "which names does this expression use", but several things people ask for need the structure of the expression, not just its leaves:

  • #30 wants to know which element or clause made an exists/&& chain true or false. cel-rust has no evaluation hooks, so a wrapper-side explain() would have to walk the tree and re-evaluate sub-expressions.
  • Policy linting beyond name lists: "no matches() on untrusted input", "no more than N nested comprehensions", "field access only under request.".
  • Pretty-printing / normalising expressions stored by users.

What upstream gives us

cel::Program::expression() returns the parsed Expression (IdedExpr: an id plus an Expr enum covering literals, identifiers, selects, calls, lists, maps, structs and the expanded comprehensions). No protobuf AST, but the shape is close to cel.expr.Expr and would be straightforward to mirror as nested dicts or small dataclasses.

Proposal

Program.ast() returning a plain, JSON-serialisable tree, e.g. {"kind": "call", "function": "_&&_", "args": [...]}, with comprehension macros shown in their expanded form (that is what cel-rust holds after parsing; the original macro call is not retained). Ship it as provisional, tied to the cel-rust version, and note that the node shapes may change when cel-rust changes its AST.

A Python-side cel.explain(program, context) built on it could then evaluate each boolean sub-expression and report the first failing clause, which covers the exists/all case in #30 without upstream changes, at the cost of re-evaluation (custom functions run again).

Langage dominant
Python
Étoiles
43
Forks
4
Merge moyen
12 h 37 min
PR mergées (30 j)
11

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de hardbyte/python-common-expression-language

Toutes les issues de hardbyte/python-common-expression-language

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.