Learning Python, writing in the form of an educational project To-Do list. Faced a problem: Python opens to work with empty lists, it gives an error:

AttributeError: 'NoneType' object has no attribute 'append'

It is clear that an empty object produces this, but if I need it initially empty, then how to work with it later? Or tell me where I'm not doing it right.

Program Code:

import shelve def addNewTask(taskArticle, taskDescribe, taskDeadline, taskPriority): tasklistArticles.append(taskArticle) tasklistDescribes.append(taskDescribe) tasklistDeadlines.append(taskDeadline) tasklistPriorities.append(taskPriority) db = shelve.open("save", flag='n', protocol=None, writeback=False) db["articles"] = tasklistArticles db["describes"] = tasklistDescribes db["deadlines"] = tasklistDeadlines db["priorities"] = tasklistPriorities db.close() return tasklistArticles = [] tasklistDescribes = [] tasklistDeadlines = [] tasklistPriorities = [] listLength = 0 db = shelve.open("save", flag='n', protocol=None, writeback=False) tasklistArticles = db.get("articles") tasklistDescribes = db.get("describes") tasklistDeadlines = db.get("deadlines") tasklistPriorities = db.get("priorities") db.close() while True: if(tasklistArticles==None): command = input("Список задач пуст. Введите [+] для создания задачи\n") else: listLength = len(tasklistArticles) for i in range(listLength): print("\n", tasklistArticles[i]) command = input("Введите номер задачи или [+] для создания новой\n") if (command=="+"): taskArticle = input("Заголовок задачи:\n") taskDescribe = input("Описаниее задачи:\n") taskDeadline = input("Дедлайн:\n") taskPriority = input("Приоритет (от 0 до 10):\n") addNewTask(taskArticle, taskDescribe, taskDeadline, taskPriority) elif(int(command)<=listLength): print("\n-----\n", tasklistArticles[int(command)], "\n", tasklistDescribes[int(command)], "\n", tasklistDeadlines[int(command)],"\n", tasklistPriorities[int(command)], "\n-----\n") elif(int(command)>listLength): print("Неверный номер задачи") else: print("Ошибка: неизвестная команда") 

    2 answers 2

    You have a non-empty list, you get None in variables after a call to the get function, since you did not specify a different default value.

    Change the lines:

     tasklistArticles = db.get("articles") tasklistDescribes = db.get("describes") tasklistDeadlines = db.get("deadlines") tasklistPriorities = db.get("priorities") 

    on:

     tasklistArticles = db.get("articles", []) tasklistDescribes = db.get("describes", []) tasklistDeadlines = db.get("deadlines", []) tasklistPriorities = db.get("priorities", []) 

    And the line:

     if(tasklistArticles==None): 

    On line:

     if not tasklistArticles: 

      You are confusing the empty list and None. The empty list has attributes, but None of the append attribute is definitely not there. Therefore, after you have verified that the object is None, you need to create a new list. In addition, since you are changing an object in a function, you must use global to access the global object.

       def addNewTask(taskArticle, taskDescribe, taskDeadline, taskPriority): global tasklistArticles ... while True ... if(tasklistArticles==None): tasklistArticles = [] command = input("Список задач пуст. Введите [+] для создания задачи\n")