# -*- coding: utf-8 -*-"""API for traversing the AST nodes. Implemented by the compiler andmeta introspection."""from .nodes import Nodeclass NodeVisitor(object):"""Walks the abstract syntax tree and call visitor functions for everynode found. The visitor functions may return values which will beforwarded by the `visit` method.Per default the visitor functions for the nodes are ``'visit_'`` +class name of the node. So a `TryFinally` node visit function wouldbe `visit_TryFinally`. This behavior can be changed by overridingthe `get_visitor` function. If no visitor function exists for a node(return value `None`) the `generic_visit` visitor is used instead."""def get_visitor(self, node):"""Return the visitor function for this node or `None` if no visitorexists for this node. In that case the generic visit function isused instead."""method = "visit_" + node.__class__.__name__return getattr(self, method, None)def visit(self, node, *args, **kwargs):"""Visit a node."""f = self.get_visitor(node)if f is not None:return f(node, *args, **kwargs)return self.generic_visit(node, *args, **kwargs)def generic_visit(self, node, *args, **kwargs):"""Called if no explicit visitor function exists for a node."""for node in node.iter_child_nodes():self.visit(node, *args, **kwargs)class NodeTransformer(NodeVisitor):"""Walks the abstract syntax tree and allows modifications of nodes.The `NodeTransformer` will walk the AST and use the return value of thevisitor functions to replace or remove the old node. If the returnvalue of the visitor function is `None` the node will be removedfrom the previous location otherwise it's replaced with the returnvalue. The return value may be the original node in which case noreplacement takes place."""def generic_visit(self, node, *args, **kwargs):for field, old_value in node.iter_fields():if isinstance(old_value, list):new_values = []for value in old_value:if isinstance(value, Node):value = self.visit(value, *args, **kwargs)if value is None:continueelif not isinstance(value, Node):new_values.extend(value)continuenew_values.append(value)old_value[:] = new_valueselif isinstance(old_value, Node):new_node = self.visit(old_value, *args, **kwargs)if new_node is None:delattr(node, field)else:setattr(node, field, new_node)return nodedef visit_list(self, node, *args, **kwargs):"""As transformers may return lists in some places this methodcan be used to enforce a list as return value."""rv = self.visit(node, *args, **kwargs)if not isinstance(rv, list):rv = [rv]return rv
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。