Как эффективно оценить ряд методов и назвать те, которые не являются ложными? - PullRequest
0 голосов
/ 13 декабря 2018

Класс ниже получает строку в качестве входных данных и создает другую строку с помощью метода answer().

class Question:

    a = ["hello", "hi"]
    b = ["how are you", "how do you do"]
    c = ["how is the weather", "is it cold today"]

    def __init__(self, question):
        self.question = question

    def get_greeting(self):
        if self.question in Question.a:
            return "Hi There!"

    def get_health(self):
        if self.question in Question.b:
            return "I am fine"

    def get_weather(self):
        if self.question in Question.c:
            return "It is warm"

    def answer(self):

        if self.get_greeting():
            return self.get_greeting()
        elif self.get_health():
            return self.get_health()
        elif self.get_weather():
            return self.get_weather()
        else:
            return "I don't understand"

question = Question("how is the weather") 
print(question.answer()) # getting the output

Для меня вышеупомянутое плохо, потому что код внутри answer() длинный, и он вызывает каждый метод дважды.

Поэтому я придумал «лучший» метод answer(), который вызывает методы только один раз, но все еще много условных условий.

def answer(self):

    result = self.get_greeting()
    if result:
        return result

    result = self.get_health()
    if result:
        return result

    result = self.get_weather()
    if result:
        return result

    return "I don't understand"

Я думаю, что может бытькакая-то другая техника, которую мне здесь не хватает.Кто-нибудь может что-то подсказать?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Результатом or является левый операнд, если это не «false-y», в противном случае правый операнд.
Он также оценивает правый операнд только тогда, когда это необходимо.

def answer(self):
    return self.get_greeting() \
        or self.get_health() \
        or self.get_weather() \
        or "I don't understand"
0 голосов
/ 13 декабря 2018

Вы можете сделать кортеж из всех методов и затем вызывать их, пока один из них не вернет что-то:

def answer(self):
    methods = (self.get_greeting, self.get_health, self.get_weather)
    for m in methods:
        res = m()
        if res:
            return res
    return "I don't understand"

Редактировать

Если вы действительно хотите создать многометодов и ваша функция answer() пробует их все, не сообщая об этом явно, вы можете использовать этот код:

def answer(self):
        getters = (v for k, v in self.__class__.__dict__.items() if k.startswith("get_"))
        for method in getters:
            res = method(self)
            if res:
                return res
        return "I don't understand"

Edit 2

Если ваша система простополучает строку в качестве входных данных и генерирует из нее предопределенные выходные данные. Вы можете немного ее упростить:

knowledge = [
    (["hello", "hi"], "Hi There"),
    (["how are you", "how do you do"], "I am fine"),
    (["how is the weather", "is it cold today"], "It is warm")
]

def answer(question):
    for inputs, answer in knowledge:
        if question in inputs:
            return answer
    return "I don't understand"

print(answer("hello"))

Используя этот подход, добавить новую фразу в чат-бота так же просто, как добавитьстрока к структуре данных знаний.

...