Python модуль выводит правильное значение, затем возвращает None - PullRequest
0 голосов
/ 14 марта 2020
if len(cur_node.members) <= 1:
    print(cur_node.members)
    member = str(cur_node.members[0])
    print(member)
    return member

Вся программа здесь: gitlab: dicotomous_key 1 : https://gitlab.com/vanzippee/dicotomous_key

Программа печатает «cur_node.member» и «member» правильно (только что добавлено для проверки), но возвращаемое значение при печати равно «None».

Я не решался поставить весь модуль здесь из-за длины, но здесь это так. Я изменил оператор с исходного (в git), который называл базу данных, на оператор, открывающий файл json.

Json файл для библиотеки:

Весь модуль:

import json


class node:
    def __init__(self, members=None, criterion_index=0):
        print("new_node:", members)
        self.members = members
        self.criterion_index = criterion_index
        self.left_child = None
        self.right_child = None
        self.y = []
        self.n = []


class tree:
    def __init__(self, criteria, doc):
        self.root = None
        self.criteria = criteria
        self.doc = doc

    def insert(self, members):
        if self.root is None:
            self.root = node(members)
            self.insert(members)
        else:
            separated = self._insert(self.root, members)
            print("separated =", separated)
            return separated

    def _insert(self, cur_node, members):
        if len(cur_node.members) <= 1:
            print(cur_node.members)
            member = str(cur_node.members[0])
            print(member)
            return member
        elif cur_node.criterion_index < len(self.criteria):
            y = []
            n = []
            for member in members:
                if member in self.doc[self.criteria[cur_node.criterion_index]]:
                    y.append(member)
                else:
                    n.append(member)
            cur_node.criterion_index += 1
            if len(y) > 0 and len(n) > 0:
                if cur_node.left_child is not None:
                    cur_node = cur_node.left_child
                    self._insert(cur_node, y)
                else:
                    cur_node.left_child = node(y, 
                        cur_node.criterion_index)
                    self._insert(cur_node.left_child, 
                        cur_node.left_child.members)
            elif (len(y) == 0 and len(n) > 0 and cur_node.left_child is 
                    not None):
                if cur_node.right_child is not None:
                    cur_node = cur_node.right_child
                    self._insert(cur_node, n)
                else:
                    cur_node.rigth_child = node(n, 
                        cur_node.criterion_index)
                    self._insert(cur_node.right_child, 
                        cur_node.right_child.members)
            else:
                self._insert(cur_node, cur_node.members)

    def print_tree(self):
        if self.root is not None:
            self._print_tree(self.root)

    def _print_tree(self, cur_node):
        if cur_node is not None:
            self._print_tree(cur_node.left_child)
            if len(cur_node.members) == 1:
                print(cur_node.members, "separated.")
            self._print_tree(cur_node.right_child)


def make_dicotomous_key(user, category):
    with open('doc.json') as json_file:
        doc = json.load(json_file)
    members = doc["members"]
    criteria = doc["criteria"]
    dicotomous_key = tree(criteria, doc)
    while len(members) > 0:
        separated = dicotomous_key.insert(members)
        if separated is not None:
            print("returned", separated)
            members.remove(separated)
    dicotomous_key.print_tree()


if __name__ == "__main__":
    user = "default"
    category = "shark_faimilies"
    make_dicotomous_key(user, category)

1 Ответ

0 голосов
/ 16 марта 2020

похоже, что вы делаете там рекурсию, я думаю, вам следует заменить self._insert на return self._insert. Первый if возвращает члены, но затем, когда функция возвращается и возвращается к одному из вызовов self._insert, ничего не возвращается.

...