def test_result(self):
     """测试查重方法是否正确"""
     self.postfix_formula1 = FormatUtils.get_result_formula(
         self.source_expr)  # 转换成后缀表达式
     self.postfix_formula2 = FormatUtils.get_result_formula(
         self.target_expr)
     self.check_formula1 = FormatUtils.get_check_formula(
         self.postfix_formula1)  # 转换成查重表达式
     self.check_formula2 = FormatUtils.get_check_formula(
         self.postfix_formula2)
     self.assertEqual(
         True,
         Tree.duplicate_check(self.check_formula1, [self.check_formula2]),
         """查重失败""")
    def generate_formula(self, num_range, number, negative):
        """随机生成式子"""
        num = 0
        degree = random.randrange(3, 4)  # 随机设置操作数的个数
        while num < number:
            empty_node = [self.root]
            for _ in range(degree):
                '''生成操作符号节点'''
                node = random.choice(empty_node)
                empty_node.remove(node)
                node.operator = random.choices(self.op_list,
                                               cum_weights=self.op_weight)[0]
                # node.operator = random.choices(self.op_list)[0]
                node.type = 2

                # 每生成一个操作符号节点,生成两个空节点
                node.left = Node()
                node.right = Node()
                empty_node.append(node.left)
                empty_node.append(node.right)

            for node in empty_node:
                '''将所有空结点变为数字结点'''
                node.type = 1
                # 设置真分数的比重 1为整数 0为分数
                num_type = random.choices(self.type_list, self.num_weight)[0]
                if num_type == 1:
                    # 生成一个整数
                    node.number = random.randint(1, num_range)
                else:
                    # 生成一个真分数
                    node.number = Fraction(random.randint(1, num_range),
                                           random.randint(1, num_range))
            try:
                # self.root.show_node()  # 获取生成的二叉树结构
                self.root.get_answer(negative)  # 计算答案
                if self.root.number.denominator > 99:  # 分母超过99抛出异常
                    raise DifficultError()

                self.pre_formula = self.root.get_formula()  # 获取前缀表达式
                self.post_formula = FormatUtils.get_result_formula(
                    self.pre_formula)  # 获取后缀表达式
                self.check_formula = FormatUtils.get_check_formula(
                    self.post_formula)  # 获取查重表达式
                a.append(self.pre_formula)
                b.append(self.post_formula)
                c.append(self.check_formula)

                # 进行查重
                if not Tree.duplicate_check(self.check_formula,
                                            self.result_formula):
                    # 返回false 则表明没有重复
                    self.result_formula.append(self.check_formula)
                else:
                    raise DuplicateError

                output = FormatUtils.standard_output(
                    self.pre_formula)  # 格式化前缀表达式
                if isinstance(self.root.number, Fraction):
                    answer = FormatUtils.standard_format(
                        self.root.number)  # 格式化答案
                else:
                    answer = self.root.number
                # print(output, answer)
                self.formula.append(output)
                self.answer.append(answer)
            except ZeroDivisionError:
                # print("除数为零,删除该式子")
                continue
            except NegativeError:
                # print("出现负数,删除该式子")
                continue
            except DifficultError:
                # print("题目较难,删除该式子")
                continue
            except DuplicateError:
                # print("题目重复,删除该式子")
                continue
            else:
                num += 1
        return self.formula, self.answer