Я проходил курс разработки API, когда столкнулся с этой проблемой. Предполагается, что функция проверяет каждое сообщение на уникальность id
, а затем возвращает его индекс, если id
сообщений совпадает (с помощью перечисления). Но почему-то он всегда возвращает тип None.
Допустим, я жестко запрограммировал эти конкретные сообщения с их свойствами:
my_posts = [{"title": "title of post 1", "content": "content of post1", "id": 1}, {"title": "Favorite Foods", "content": "I like pizza", "id": 2}]
Это функция, которая будет использоваться для поиска индекса сообщений, которые я пытаюсь удалить:
def find_index_post(id):
for i, p in enumerate(my_posts):
if p["id"] == id:
return i
И это будет функция/логика удаления:
@app.delete("/posts/{id}")
def delete_post(id):
index = find_index_post(id)
my_posts.pop(index)
return{'message': f"post with id '{id}' is deleted"}
Проблема в том, что find_index_post(id)
всегда возвращает None
переменной index
.
Но когда я отладил его, изменив find_index_post(id)
на find_index_post(1)
, это сработало и вернуло значение 0 в переменную index
, что правильно.
Что-то не так с тем, как я обработал свой тип данных, или я упустил какую-то важную деталь. Спасибо.
Вы уверены, что id
в вашей функции delete_posts является целым числом, а не строкой?
Вы не учитываете обстоятельство, когда id не может быть найден в вашем списке словарей. Кроме того, не используйте id в качестве имени переменной, поскольку это затенит встроенную функцию с тем же именем.
Я думаю, проблема в том, что вы передали идентификатор как строку. Но в данных ваших сообщений идентификатор является целым числом, а не строкой. Поэтому я думаю, вам нужно немного обновить свой код, как показано ниже.
def find_index_post(id):
id = int(id) # Convert id to interger
for i, p in enumerate(my_posts):
if p["id"] == id:
return i
Я думаю,
id
— это строка, а не целое число.