Python Внезапно появляется сообщение «AttributeError: объект 'NoneType' не имеет атрибута» - PullRequest
0 голосов
/ 12 июля 2020

, поэтому у меня есть несколько объектов 5 'Player', создаваемых в начале моего кода, и около 24 различных объектов 'Skill' для каждого объекта 'Player', я использую это для l oop через мой код

first_run = True

while True:
    for i in range(len(player_name)):
    if first_run is True:
        player[i] = Player(player_name[i], player_url[i], player_thumbnail[i])
        print(player[i].name, "'s Object Created")

    data = requests.get(player_url[i])
    statusCheck(data.status_code, player_name[i])
    data_processed = re.split(', |\n', data.text)

    storeData(data_processed, player[i], first_run)

logging.info("Sleeping for 10 Seconds")
time.sleep(10)
first_run = False

в основном при первом прохождении этого, в то время как l oop, он создаст 5 объектов игрока с предопределенными именами, которые хранятся в списке выше. теперь, когда мой код достигает storeData(data_processed, player[i], first_run), возникает проблема в этой функции, проблема, говорящая, что атрибут, созданный при создании первого объекта игрока, не существует, он работал абсолютно идеально, а затем внезапно он перестал работать, я даже не изменил что-нибудь и внезапно он больше не работает, вот функция "storeData" (далее ниже - ошибка журнала)

def storeData(data_processed, player, first_run):
line_count = 0
for line in data_processed:
    if line != '':
        skill_data = line.split(',')
        if line_count < 24:
            player_skill = None
            player_skill = getattr(player, skills[line_count])
            player_skill.rank = skill_data[0]
            player_skill.level = skill_data[1]
            player_skill.xp = skill_data[2]
            line_count = line_count + 1
            if player_skill.last_level != player_skill.level and first_run is not True:
                logging.info(player.name, "Gained A Level in ", skills[line_count])
                pushLevelUp(discordUrl,skills[line_count-1], player, player_skill)
            player_skill.last_level = skill_data[1]

        elif line_count < 79:
            player_activity = getattr(player, activity[line_count - 24])
            player_activity.last_count = player_activity.count
            player_activity.rank = skill_data[0]
            player_activity.count = skill_data[1]
            line_count = line_count + 1

ниже - ошибка журнала, я ничего не менял, как я сказал , но он больше не находит player.skill.O Total (с помощью getattr)

    Traceback (most recent call last):
  File "*hidden*", line 42, in <module>
    storeData(data_processed, player[i], first_run)
  File "*hidden*", line 142, in storeData
    player_skill = getattr(player, skills[line_count])
AttributeError: 'NoneType' object has no attribute 'Overall'

Process finished with exit code 1

это списки, в которых я храню данные для «навыков»

skills = ['Overall', 'Attack', 'Defence', 'Strength', 'Hitpoints', 'Ranged', 'Prayer', 'Magic', 'Cooking',
      'Woodcutting', 'Fletching', 'Fishing', 'Firemaking', 'Crafting', 'Smithing', 'Mining', 'Herblore',
      'Agility', 'Thieving', 'Slayer', 'Farming', 'Runecrafting', 'Hunter', 'Construction']

вот краткое изложение

player_skill = getattr(player, skills[line_count]) на первой итерации должно указывать непосредственно на объект игрока, переданный в функцию storeData, для этого примера я использую "player" в качестве имени объекта .. . getattr на первой итерации должен указывать прямо на player.Overall, что позволило бы мне вызвать player.Overall.level, однако он говорит, что не может найти player.Overall при использовании player_skill = getattr(player, skills[line_count])

здесь a re мои файлы .py https://pastebin.com/q2VEFGfk (это файл с именем 'runebotClassData'), а этот https://pastebin.com/h7BEckgR (runebotTest.py)

как я уже сказал, Я ничего не изменил, похоже, что api возвращает данные в обычном режиме, и возникает эта ошибка, пожалуйста, помогите

1 Ответ

0 голосов
/ 15 июля 2020

вау, я полностью это упустил, меня ослепила ошибка, указывающая на то, где вызывается player [i], а не на то, где он был определен, и это не было определено, если мой режим тестирования был включен (first_run = False), я должен был иметь уделил больше внимания декларации

...