On one hand I can see how this may cause little inconvenience, but on other
hand this would be a breaking change, so I don't think it is realistic.
Also I think this is often alleviated by using super().

Maybe it is possible to preserve backwards compatibility by making ast_list
a subclass of list? Or is it not possible for some reason?

--
Ivan



On Thu, 15 Aug 2019 at 22:32, Caleb Donovick <donov...@cs.stanford.edu>
wrote:

> When walking an ast it impossible to know the type of an empty list
> without writing down some giant lookup from node types and field names to
> field types.
>
> More concretely it would nice be to able to programatically visit all
> blocks (stmt*)  without having to something like:
>
> ```
> class BlockVisitor(NodeVisitor):
>     def visit_If(self, node: If):
>         self.visit(node.test)
>         self.visit_block(node.body)
>         self.visit_block(node.orelse)
>
>     def visit_FunctionDef(self, node: FunctionDef):
>         for field, value in iter_fields(node):
>             if field == 'body':
>                 self.visit_block(value)
>             else:
>                 # the implementation of generic_visit
> ```
> Now it turns out that all fields that are lists and are named "body",
> "orelse", or "finalbody" are stmt* and only such fields are stmt*.  A rule
> could also be synthesized to identify expr* and so forth but this seems
> incredibly hacky to me.
>
> It would be much cleaner if <type>* were actual nodes in the ast. E.g.
> something like:
> ```
> class ast_list(AST, MutableSequence[T_co]): ...
> class StmtList(ast_list[stmt]): ...
> class ExprList(ast_list[expr]): ...
> ...
> class FunctionDef(stmt):
>     name: identifier
>     args: arguments
>     body: StmtList
>     decorator_list: ExprList
>     returns: Optional[expr]
> ```
> This would not change the behavior or structure in any way other than
> tagging <type>* and allowing <type>* to be visited.
>
> It would potentially break old code which relies on stuff like `if
> isinstance(node.field, list)` e.g. the implementation of generic_visit.
>
>
> Caleb Donovick
>
> _______________________________________________
> Python-ideas mailing list -- python-ideas@python.org
> To unsubscribe send an email to python-ideas-le...@python.org
> https://mail.python.org/mailman3/lists/python-ideas.python.org/
> Message archived at
> https://mail.python.org/archives/list/python-ideas@python.org/message/ZHOXQTDSHOERZSGUJXLNJCYLKKQJOYTA/
> Code of Conduct: http://python.org/psf/codeofconduct/
>
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/UXZN3L6YSSUK7YKIZOBSDKKWG4F3YYUM/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to