Метод экземпляра, возвращающий неправильное значение - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть класс для системы диалога следующим образом

class DIALOGUE(object):
    def __init__(self, place, who, sTime, eTime, isActive, mood, menuText, func, repeatable, num):
        self.place = place
        self.who = who
        self.sTime = sTime
        self.eTime = eTime
        self.isActive = isActive
        self.mood = mood
        self.menuText = menuText
        self.func = func
        self.repeatable = repeatable
        self.num = num

    @property
    def ACheck(self):
        global Date
        if self.sTime == "none":
            return True
        else:
            tHour,tMin = self.sTime.split(":")
            if tHour >= Date.Hour and tMin <= Date.Minute:
                tHour,tMin = self.eTime.split(":")
                if tHour < Date.Hour and tMin < Date.Minute:
                    return True
        return False

    @property
    def BCheck(self):
        global Act
        if self.who == Act:
            return True
        else:
            return False

    @property
    def CCheck(self):
        global Location
        if self.place == Location:
            return True
        if self.place == "none":
            return True
        return False

    @property
    def DCheck(self):
        if self.repeatable:
            return True
        else:
            if self.num > 0:
                return False
            else:
                return True

    @property
    def CanChat(self):
        if self.isActive and self.ACheck and self.BCheck and self.CCheck and self.DCheck:
            return True
        else:
            return False

    def SetActive(self):
        self.isActive = True

    def Do(self):
        self.num += 1
        renpy.call(self.func)

Большая часть этого должна быть понятна, но я разбираю файл XML в список Экземпляров этого класса.

Пользователю предоставляется список доступных диалогов, в зависимости от того, в каком они месте, в какое время суток и какого NPC они выбрали. Если диалог не повторяется Метод DCheck проверяет, был ли диалог завершен раньше, т. Е. Если диалог не повторяется и self.num > 0 метод вернет False

По сути, он проходит по всем диалогам и выполняет i.CanChat, и если это значение возвращает True, диалог добавляется в меню

У меня проблема в том, что методы Check не возвращают правильное значение. В частности, DCheck постоянно возвращает True независимо от того, является ли диалог повторяемым или нет, и игнорирует значение self.num

Класс создается в блоке init python:, а затем файл xml анализируется в отдельном блоке python, который вызывается из начальной метки

Возможно, это что-то действительно простое, но я не могу понять это.

Список экземпляров анализируется следующим образом

Dialogues = []
    for j in Dialo:
        JPlace = j.find('Place').text
        JWho = j.find('Who').text
        JsTime = j.find('Start').text
        JeTime = j.find('End').text
        JMood = int(j.find('Mood').text)
        JText = j.find('Text').text
        JFunc = j.find('Func').text
        JRep = j.find('Rep').text
        if JRep == "True":
            Jrep = True
        else:
            Jrep = False
        Dialogues.append(DIALOGUE(JPlace, JWho, JsTime, JeTime, False, JMood, JText, JFunc, JRep, 0))

Метод создания меню следующий:

def TalkCheck():
    talks = []
    talks.append(("Nevermind.", "none"))
    for i, q in enumerate(Dialogues):
        if q.CanChat:
            talks.append((q.menuText,i))
    renpy.say(None, "", interact=False)
    talkchoice = renpy.display_menu(talks)
    if talkchoice <> "none":
        talkchoice = int(talkchoice)
        Dialogues[talkchoice].Do()

1 Ответ

0 голосов
/ 10 сентября 2018

Ваш вопрос не завершен - вы не опубликовали MCVE, мы не знаем эффективных значений «repeatble» и «num», которые приводят к такому поведению, и мы даже не знаем, использует ли он Python 2 .x или Python 3.x - так что мы можем просто попытаться угадать. Теперь, когда вы упомянули, что «анализируете файл XML в список экземпляров», я сильно подозреваю, что вы используете Python 2.x и передаете эти значения в виде строк вместо (соответственно) логических и int. В Python 2 "-1" (строка) сравнивается больше, чем 0 (int) - это повышает TypeError в Python 3.x -, и в обоих случаях непустая строка превращается в True в логическом значении контекст (bool('False') == True). Поскольку в реализации вашего метода нет очевидной логической ошибки, это единственное объяснение, которое я могу придумать.

Кстати, выражения имеют логические значения и return выходит из функции, так что вы можете упростить свой код:

@property
def DCheck(self):
    if self.repeatable:
        return True
    return self.num > 0
...