Задать вопрос
Ответы пользователя по тегу Python
  • Ошибка expected expect or finally block.Как решить?

    Frostealth
    @Frostealth
    Backend Developer
    Исключения в python
    try:
        # your code
    except ExceptedException as exc:
        # handle the exception
    Ответ написан
    Комментировать
  • Почему выводит ошибку(sqlite3)?

    Frostealth
    @Frostealth
    Backend Developer
    Потому что происходит попытка добавить пользователя с `user_id`, который уже существует.
    В таблице уже есть пользователь с таким `user_id`, и БД выдает ошибку об этом, т.к. стоит ограничение о том, что `user_id` должен быть уникальным, без дублей.

    Добавьте AUTOINCREMENT для `user_id` в таблице и не указывайте `user_id` при добавлении нового пользователя. В таком случае БД будет сама выставлять числовой идентификатор для новых юзеров.
    Другой вариант - это использовать uuid4 или ему подобные для генерации случайного идентификатора на стороне приложения.

    Предлагаю почитать: https://metanit.com/sql/sqlite/2.3.php

    В случае, если данные юзеров, в т.ч. и идентификаторы, приходят из одного внешнего источника (например из телеграма) и нужно опираться на них, то необходимо проверять наличие юзера в таблице по `user_id`. Если такого юзера нет - добавлять, если уже есть - обновлять.

    Также можно поступить проще: INSERT ON CONFLICT DO.
    -- если пользователь уже существует, то просто игнорировать
    INSERT INTO 'users' (user_id) VALUES (?) ON CONFLICT(user_id) DO NOTHING
    
    -- если пользователь уже существует, то обновить ему `referrer_id`
    INSERT INTO 'users' (user_id, referrer_id) VALUES (?, ?) 
        ON CONFLICT(user_id) DO UPDATE SET referrer_id = excluded.referrer_id
    Ответ написан
  • Почему свойства экземпляра класса не являются изолироваными в данном примере?

    Frostealth
    @Frostealth
    Backend Developer
    Потому что `A::__data` ссылается на общий для всех экземпляров список. Предлагаю почитать.

    Ошибка заключается в присвоении значения списка (работает так со всем) свойству класса. Другими словами, свойство класса будет содержать ссылку на объявленный список, которая будет и у экземпляров класса.
    class A:
        __data = []  // список будет общий для всех экземпляров класса A


    Присвоить значение непосредственно экземпляру класса можно в методе `__init__`
    class A:
        def __init__(self):
            self.__data = []
    Ответ написан
    5 комментариев