• Как получать значение атрибута, обращаясь к экзмепляру класса?

    Vindicar
    @Vindicar
    RTFM!
    Есть несколько способов.
    1. Пусть твой класс наследуется от collections.abc.MutableSequence и сам реализует минимально нужный набор методов (__getitem__, __setitem__, __delitem__, __len__, insert). Остальные методы списка MutableSequence реализует за тебя. Разумеется, если твое поле - не список, то нужно будет наследоваться от другого класса.
    2. Если твой класс всегда будет полем другого класса, ты можешь реализовать метод __get__(). Через него работают свойства (property). Но имей ввиду, что в этом случае ты вообще никогда не сможешь обратиться к чему-либо кроме того поля, которое возвращаешь.
    Ответ написан
    Комментировать
  • Почему при исполнении импортированого кода исполняется код из другого импорта?

    Vindicar
    @Vindicar
    RTFM!
    xx_RuBiCoN_xx, ну потому что надо не просто копипастить код, а документацию изучать, чтобы понимать, за что отвечает каждая часть твоего кода.
    @bot.callback_query_handler(func=lambda call: True)

    Параметр func должен содержать ссылку на функцию-фильтр, которая определит, должен ли данный обработчик вызываться для данного callback query. При этом вызовется первый подходящий обработчик, т.е. первый обработчик, у котого фильтр вернёт True.
    У тебя везде понатыкано lambda call: True, т.е. "для любого query вызывать этот обработчик". Как следствие, первый объявленный "универсальный" обработчик вызывается всегда и для всего. На имя функции боту наплевать.

    Самый простой способ разделить код на два обработчика - убедиться, что call.data имеет хорошо различимые значения. Например, добавить префикс: у кнопок для одного обработчика call.data пусть всегда начинается с "btn1.", а у другого с "btn2.". Тогда можно будет написать функцию-фильтр вида lambda call: call.data.startswith('btn1.') и т.п.
    Ответ написан
    2 комментария
  • Как правильно сделать вывод данных из sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    Category ID пробелы в именах столбцов - не лучшая идея. У тебя точно толбец так называется? Если да, то оберни имя столбца в `бэктики` (обычно на клавише Ё).
    Ну и да, сдаётся мне, что 'call.data' не будет работать так, как ты это ожидаешь.
    Ответ написан
    Комментировать
  • Как перенести информацию с формы на форму в рамках ООП C#?

    Vindicar
    @Vindicar
    RTFM!
    Я не гарантирую, что мой совет будет толковым, но... имхо, требование о приватности полей следует применять умеренно - в первую очередь в классах с нетривиальными методами. Там это позволяет избежать внезапного изменения поля, когда логика работы методов этого не ожидает. В этом случае сеттер свойства может проверить, разрешено ли изменять поле в настоящий момент, и действовать соответственно.

    Разумеется, свойства необходимы, если мы планируем использовать паттерн Наблюдатель(Observer), который в C# реализуется через интерфейсы INotifyPropertyChanged и INotifyPropertyChanging. Если вкратце - если мы хотим, чтобы другие объекты могли подписаться на наш объект, и получать уведомления об изменении его состояния. Тут всё понятно - сеттер свойства будет эти уведомления рассылать.

    Также свойства могут выручить, если мы потом захотим изменить способ хранения данных, но не захотим изменять "внешний вид" (интерфейс) объекта. Тогда в геттер свойства можно будет поместить код, который пересчитает "внутреннее" представление свойства во "внешнее".

    В случае примитивных data transfer objects, как User в твоём примере, я не вижу особенного смысла в использовании свойств ради свойств. Я бы даже сделал его struct, а не class, но это уже пусть спецы по C# меня поправят.

    Вообще, любую рекомендацию по проектированию нужно рассматривать не как заповедь, а как некий размен (trade-off): мы выигрываем в X, но проигрываем в Y (зачастую Y = сложность кода). И, соответственно, смотреть, что для тебя важнее.
    Ответ написан
    Комментировать
  • Progress bar как вывести результат?

    Vindicar
    @Vindicar
    RTFM!
    Оставаясь в рамках стандартного терминала - никак.
    Под никсами для сложного интерфейса в терминале есть ncurses, под виндой придётся искать аналог.
    Я бы сказал, если нужно что-то сложнее print() - осваивай tkinter. Если написать программу с умом, то можно будет сделать гибридное приложение, которое будет показывать GUI при обычном запуске, и работать в консоли при запуске с параметрами. Это если такое требуется, конечно - я фз какой у тебя сценарий использования.

    UPD: есть вариант использовать для вывода прогрессбара stderr, а для вывода результатов stdout, но в терминале они всё равно перемешаются.
    Ответ написан
    Комментировать
  • Ошибка sqlite3.IntegrityError: UNIQUE constraint failed: users.user_id Как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Ты добавляешь уже существующего пользователя.
    Прочитай про запрос INSERT ... ON CONFLICT DO ... .
    Тут есть два варианта:
    INSERT ... ON CONFLICT DO UPDATE (он же UPSERT), чтобы обновить данные о пользователе.
    INSERT ... ON CONFLICT DO NOTHING, чтобы молча проигнорировать уже существующего пользователя.
    Ответ написан
    Комментировать
  • Как исправить ошибку с регулярными выражениями?

    Vindicar
    @Vindicar
    RTFM!
    Ну так почитай основы.
    Во-первых, используй r-строки, чтобы не натыкаться на проблемы с символом \.
    Во-вторых, изучи зарезервированные символы регулярных выражений, а именно: ( ) [ ] ^ $ . ? * +. Если тебе нужен этот символ как просто символ, его надо экранировать! Т.е. если тебе нужно совпадение с символом ?, надо писать \?.
    В-третьих, для поиска символа из указанного набора используются квадратные скобки, т.е. [abc] совпадёт с одним символом из указанных: a, b или c. Для задания диапазона можно сделать так: [a-z]. Это зачастую короче.
    В-четвёртых, для поиска символа НЕ из указанного набора используется такой синтаксис: [^abc]
    В-пятых, есть заранее заданные наборы. Например, \w описывает словесные символы (буквы, цифры и подчёркивание), \d описывает цифры, и т.д. Аналогично, \W и \D описывают всё кроме словесных символов и цифр, соотв.
    Тогда у тебя будет два варианта
    Если подчёркивание - не проблема:
    re.sub(r'\W', '', 'test:_:test', re.I)  # даст test_test

    Если подчёркивание тоже нужно убрать:
    re.sub(r'[\W_]', '', 'test:_:test', re.I)  # даст testtest
    Ответ написан
    1 комментарий
  • Нужно текст, который пользователь написал с FSM передавать определенному пользователю?

    Vindicar
    @Vindicar
    RTFM!
    1. "Нужно текст, который пользователь написал с FSM передавать определенному пользователю?"
    Нет, не нужно. На будущее: формулируй вопрос по-человечески. Туда же оформление кода - этого требуют правила ресурса.

    2. По теме: у тебя в коде есть пример отправки сообщения пользователю с известным ID.
    await bot.send_message(message.chat.id, 'Здравствуйте, какой продукт вы хотите преобрести?')

    В чём проблема сделать по аналогии?
    Ответ написан
  • Не работает код ошибки Python Bot?

    Vindicar
    @Vindicar
    RTFM!
    group_members = await bot.get_chat_member(group_id)

    Я подозреваю, что ты хотел вызвать bot.get_chat_members()
    Ответ написан
    Комментировать
  • Почему код не работает асинхронно?

    Vindicar
    @Vindicar
    RTFM!
    async def parse_card(card):
        d = dict()
        # из карточки берется html
        # "вставляется" в объект супа
        # и возвращается словарь
        # внутри этой функции не используются await
        return d


    Ну а ты что хочешь-то? Асинхронность в питоне предназначена для распараллеливания операций ввода-вывода (и сводимых к ним), а не для параллельного выполнения расчётов. У тебя parse_card() всё равно что синхронная.
    Ответ написан
    1 комментарий
  • Проблема с созданием телеграм бота Python aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Проблема с созданием телеграм бота Python aiogram?

    Да, проблема.

    Читай про finite state machine в aiogram.
    Ответ написан
    Комментировать
  • Как вернуть значение из класса?

    Vindicar
    @Vindicar
    RTFM!
    Плохо гуглил. Впрочем, если гуглил по запросу "вернуть значение из класса" (что есть бессмыслица) вместо хотя бы "строковое представление объекта", то неудивительно.
    Ответ написан
    Комментировать
  • Как разделить код на несколько файлов?

    Vindicar
    @Vindicar
    RTFM!
    У тебя будет проблема с циклическим импортом: основной файл будет импортировать модули с функциями, но этим модулям будет требоваться экземпляр бота, описанный в основном файле. Эту проблему можно обойти так:
    # submodule_1.py  - модуль, содержащий часть функций бота
    def setup(bot):  
        # bot - объект бота. Можешь добавить и другие полезные параметры, такие как:
        # - объект logging.Logger для журналирования
        # - объект соединения с БД
        # - ну и что там ещё тебе потребуется
    
        # все обработчики событий объявляем ВНУТРИ setup()
        # тогда они смогут ссылаться на переданные параметры
        @bot.command('/start')  # например, чтобы использовать декораторы
        def on_start(message):
            message.reply('foobar')
    # мы описали функцию setup(), но здесь мы её не вызываем!
    
    
    # main.py - основной файл бота
    bot = ...  # создаём объект бота
    
    import submodule_1  # импортируем модуль с функциями
    # при вызове setup() будут заданы обработчики событий, описанные в ней
    submodule_1.setup(bot)  # функции передаём объект бота (и другие объекты, если она их ожидает)
    # функцию setup() нужно вызывать не более одного раза!
    # так можно добавлять столько модулей, сколько требуется.
    
    bot.run()  # дальше бота запускаем как обычно
    Ответ написан
    2 комментария
  • Реально ли выдать CoolDown на команду по условию discord py?

    Vindicar
    @Vindicar
    RTFM!
    f"SELECT premium FROM premusers WHERE id = {ctx.guild.id}"

    Используй параметризованные запросы, а не форматирование.

    А что касается кулдауна - достаточно почитать документацию.

    @discord.app_commands.checks.dynamic_cooldown(factory, *, key=...)

    If a factory function is given, it must be a function that accepts a single parameter of type discord.Interaction and must return a Cooldown or None. If None is returned then that cooldown is effectively bypassed.

    Выделение моё.
    Т.е. тебе надо написать функцию, которая принимает объект типа discord.Interaction и возвращает или объект Cooldown, описывающий, какой кулдаун надо применить, или None, если кулдауна быть не должно. Потом передаёшь эту функцию как параметр декоратора dynamic_cooldown, и готово. Пример есть по ссылке.
    Ответ написан
    1 комментарий
  • Как обработать исключение в telebot?

    Vindicar
    @Vindicar
    RTFM!
    Ну тебе же прямо написало строку, в которой ошибка.
    chat_member = bot.get_chat_member(id_list_channel[-1], 6276048962)

    И эта строка у тебя НЕ завёрнута в try-except.
    Ответ написан
  • Как сделать корректный вывод работы команды SSH?

    Vindicar
    @Vindicar
    RTFM!
    Это форматирование при выводе текста в терминал. По идее его можно попросить отключить, указав, что твой клиент это не поддерживает. Но не факт, что устройство тебя послушает.
    Управляющие последовательности ANSI

    И еще, ты читал вот этот ответ на stackoverflow?
    Там не совсем та же библиотека, но интерфейс выглядит очень похоже.
    var connInfo = new Renci.SshNet.PasswordConnectionInfo("<IP>", 22, "<USER>", "<PWD>");
    var sshClient = new Renci.SshNet.SshClient(connInfo);
    
    sshClient.Connect();
    var stream = sshClient.CreateShellStream("", 0, 0, 0, 0, 0);
    
    // Send the command
    stream.WriteLine("echo 'sample command output'");
    
    // Read with a suitable timeout to avoid hanging
    string line;
    while((line = stream.ReadLine(TimeSpan.FromSeconds(2))) != null)
    {
        Console.WriteLine(line);
        // if a termination pattern is known, check it here and break to exit immediately
    }
    // ...
    stream.Close();
    // ...
    sshClient.Disconnect();
    Ответ написан
    2 комментария
  • Как вывести сообщения пользователя в бд?

    Vindicar
    @Vindicar
    RTFM!
    @dp.callback_query_handler(text='1')
    async def id1(callback: CallbackQuery):

    Этот обработчик прикреплён к кнопкам в сообщении /start. Поэтому callback.message указывает именно на это сообщение.
    А тебе нужно дождаться следующего сообщения. Читай про finite state machine.
    Ответ написан
    Комментировать
  • Как вывести результат команды на Listbox?

    Vindicar
    @Vindicar
    RTFM!
    Что значит "нет представления"?
    Ты можешь принять строку-ответ на посланную команду?
    Если да, то раздели её по символу переноса строки ('\n') на массив строк, перебери массив циклом и добавь каждый элемент в свой listbox. Вот и всё.
    А если не можешь, то тогда надо узнавать, как это сделать.
    Ответ написан