def visit_Member(self, node): # For clauses that wrap around another clause, like # WithoutMember, reorient the target and iter before recursing. handled = False # <target> in <expr> - {<elem>} if (isinstance(node.iter, L.BinOp) and isinstance(node.iter.op, L.Sub) and isinstance(node.iter.right, L.Set) and len(node.iter.right.elts) == 1): inner_clause = L.Member(node.target, node.iter.left) node = L.WithoutMember(inner_clause, node.iter.right.elts[0]) handled = True node = self.generic_visit(node) if handled: return node # <vars> in {<elem>} if (L.is_tuple_of_names(node.target) and isinstance(node.iter, L.Set) and len(node.iter.elts) == 1): return L.SingMember(L.detuplify(node.target), node.iter.elts[0]) return node
def singletonize(self, cl, value): return L.SingMember(self.lhs_vars(cl), value)