Class Note ppp4
Class Note ppp4
# you may not use this file except in compliance with the License.
# http://www.apache.org/licenses/LICENSE-2.0
# See the License for the specific language governing permissions and
#
======================================================================
========
if isinstance(node, list):
return node
import gast
class CleanCopier(object):
super(CleanCopier, self).__init__()
self.preserve_annos = preserve_annos
if isinstance(node, list):
return node
if isinstance(node, list):
return node
return node
if isinstance(node, list):
if isinstance(node, list):
return node
for f in node._fields:
new_node = type(node)(**new_fields)
if self.preserve_annos:
for k in self.preserve_annos:
anno.copyanno(node, new_node, k)
return new_node
The copy will not include fields that are prefixed by '__', with the
Args:
node: ast.AST
copy
Returns:
ast.AST
"""
return CleanCopier(preserve_annos).copy(node)
class SymbolRenamer(gast.NodeTransformer):
self.name_map = name_map
qn = anno.getanno(node, anno.Basic.QN)
if qn in self.name_map:
new_node = gast.Name(
str(self.name_map[qn]),
ctx=node.ctx,
annotation=None,
type_comment=None)
for k in anno.keys(node):
anno.copyanno(node, new_node, k)
return new_node
return self.generic_visit(node)
for i in range(len(names)):
qn = qual_names.QN(names[i])
if qn in self.name_map:
names[i] = str(self.name_map[qn])
return names
node.names = self._process_list_of_strings(node.names)
return node
node.names = self._process_list_of_strings(node.names)
return node
return self._process_name_node(node)
if anno.hasanno(node, anno.Basic.QN):
return self._process_name_node(node)
return self.generic_visit(node)
qn = qual_names.QN(node.name)
if qn in self.name_map:
node.name = str(self.name_map[qn])
return self.generic_visit(node)
def rename_symbols(node, name_map):
renamer = SymbolRenamer(name_map)
if isinstance(node, list):
return renamer.visit(node)
def keywords_to_dict(keywords):
keys = []
values = []
for kw in keywords:
keys.append(gast.Constant(kw.arg, kind=None))
values.append(kw.value)
class PatternMatcher(gast.NodeVisitor):
self.pattern_stack = []
self.matches = True
self.pattern_stack.append(self.pattern)
self.pattern = pattern
self.generic_visit(node)
self.pattern = self.pattern_stack.pop()
def no_match(self):
self.matches = False
return False
p, = p
return True
if p == '_':
return True
return False
if not self.matches:
return
pattern = self.pattern
for f in node._fields:
if f.startswith('__'):
continue
return self.no_match()
else:
continue
return self.no_match()
v = getattr(node, f)
p = getattr(pattern, f)
if self.is_wildcard(p):
continue
return self.no_match()
self.compare_and_visit(v_item, p_item)
self.compare_and_visit(v, p)
else:
if v != p:
return self.no_match()
The pattern may contain wildcards represented by the symbol '_'. A node
matches a pattern if for every node in the tree, either there is a node of
Args:
node: ast.AST
pattern: ast.AST
Returns:
bool
"""
if isinstance(pattern, str):
pattern = parser.parse_str(pattern)
matcher = PatternMatcher(pattern)
matcher.visit(node)
return matcher.matches
It tries to break down the unpacking if possible. In effect, it has the same
Examples:
a, b = c, d
a, b = c
a = b, c
Args:
values: ast.AST
"""
targets = (targets,)
for i in range(len(target.elts)):
target_el = target.elts[i]
value_el = values.elts[i]
else:
idx = parser.parse_expression(str(i))
else:
apply_fn(target, values)
Args:
Yields:
Tuple[ast.AST, ast.AST]
Raises:
"""
node_stack = list(node)
else:
node_stack = [node]
other_stack = list(other)
else:
other_stack = [other]
n = node_stack.pop()
o = other_stack.pop()
if ((not isinstance(n, (ast.AST, gast.AST, str)) and n is not None) or
n.__class__.__name__ != o.__class__.__name__):
n, n.__class__.__name__, o, o.__class__.__name__))
yield n, o
if isinstance(n, str):
assert isinstance(o, str), 'The check above should have ensured this'
continue
if n is None:
continue
for f in n._fields:
continue
len(n_child) != len(o_child)):
raise ValueError(
'inconsistent values for field {}: {} and {}'.format(
f, n_child, o_child))
node_stack.extend(n_child)
other_stack.extend(o_child)
node_stack.append(n_child)
other_stack.append(o_child)
raise ValueError(
f, n_child, o_child))