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/