Пример #1
0
    def visit_Compare(self, py_node):
        # No chained comparisons here
        if len(py_node.ops) == 1:
            return self._make_operator(py_node.ops[0])

        # Chained comparison
        bonsai_node = py_model.PyOperator(self.scope, self.parent,
                                          operator_names[ast.And])
        props = {'ops': (operator_names[op.__class__] for op in py_node.ops)}
        return bonsai_node, self.scope, props
Пример #2
0
    def _expand_compare(cls, scope, parent, args):
        is_only_arg = len(args) == 1

        and_node = py_model.PyOperator(scope, parent, cls.and_name,
                                       from_compare=True)
        parent = parent if is_only_arg else and_node

        left, op, right = args[0]
        left_node = py_model.PyOperator(scope, parent, op, from_compare=True)
        left_node._add(left)
        left_node._add(right)

        cls._set_parent_and_scope(left, scope, left_node)
        cls._set_parent_and_scope(right, scope, left_node)

        if is_only_arg:
            return left_node

        right_node = cls._expand_compare(scope, parent, args[1:])

        and_node._add(left_node)
        and_node._add(right_node)

        return and_node
Пример #3
0
 def _make_operator(self, py_node):
     op_name = (operator_names.get(py_node.__class__)
                or operator_names[py_node.op.__class__])
     bonsai_node = py_model.PyOperator(self.scope, self.parent, op_name)
     return bonsai_node, self.scope, {'ops': ()}