Just to make sure we're on the same page: what are you using the ast module for?
Maybe moving to another lib like parso actually helps your real problem more... > On 15 Aug 2019, at 22:02, 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/E7K57XTNJ3HOUEKD7A7DRBS2J5ULIYOO/ Code of Conduct: http://python.org/psf/codeofconduct/