• Функция - global - какая очередность?

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

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала определись, какой тип данных у твоей переменной?
    Если ты хочешь добавить символ, то переменная должна быть строкой.
    i = "5"  # обрати внимание, кавычки означают строку
    i = i + ' +'
    print(i)  # 5 +
    Ответ написан
    9 комментариев
  • Где хранится информация и откуда её берет нейросеть для ответа?

    Vindicar
    @Vindicar
    RTFM!
    Окей, если объяснить на пальцах, то есть два варианта.
    1. Собственные знания модели. Большие языковые модели, по сути, умеют только одно: предсказывать следующее слово по набору предыдущих. Почти все остальные задачи сводятся к этому. Так что веса модели - это описание офигительно сложной функции, которая описывает взаимосвязь между предшествующим набором слов и последующим словом. Все "знания" модели, таким образом, сводятся к ответу на вопрос "какое слово будет дальше с наибольшей вероятностью?" Отсюда вытекают и слабые стороны языковых моделей - они не понимают, что пишут, они просто пишут "по аналогии".
    2. Retrieval Augmented Generation. Грубо говоря, в распоряжении модели есть база текстов, где каждому фрагменту сопоставлено некоторое описание его смысла. Модель использует такое же представление смысла слов в запросе, чтобы найти подходящие по смыслу фрагменты. Найдя эти фрагменты, модель строит ответ уже на основании фрагментов И запроса. Это не требует переобучения модели для добавления новых знаний, как в первом случае. Но будут проблемы, если фрагменты слишком длинные или их слишком много.
    Ответ написан
    Комментировать
  • Как вывести значения таблицы SQLite3 в inline-кнопках?

    Vindicar
    @Vindicar
    RTFM!
    А ты прочитай свой код внимательно.
    @router.message(F.text == 'Каталог')
    async def catalog(message : Message):
        categories_kb = InlineKeyboardBuilder()
        categories = db.get_group_name_from_db()
        for category in categories:
            categories_kb.add(InlineKeyboardButton(text=categories, callback_data=f'category_'))  # чему-чему равен text?
        return categories_kb.adjust(2).as_markup()  # ты же понимаешь, что строка ниже не выпонится?
    
        await message.answer('Выберите категорию товара:', reply_markup=await categories)  # что ещё за await? categories - это список.
        # или ты имел ввиду categories_kb?
    Ответ написан
    5 комментариев
  • Как float данные из БД добавить в массив и найти самое близкое число к числу из БД?

    Vindicar
    @Vindicar
    RTFM!
    Тебе не нужно вычитывать все данные из БД, чтобы потом искать их на питоне - задача прекрасно решается в рамках SQL запроса.
    Если под "самым близким" числом ты понимаешь самое близкое по модулю, то задача звучит так: найти в таблице число, модуль разности которого с заданным числом минимален.
    Например, если у нас таблица Numbers, в которой есть столбец num, содержащий искомые числа, то запрос будет иметь вид:
    SELECT * FROM Numbers ORDER BY ABS(num - заданное_число) ASC LIMIT 1

    Т.е. мы для все строк в Numbers рассчитываем разность между num и заданным числом, находим модуль, сортируем по возрастанию этого модуля (т.е. сортируем числа от близких к далёким), а потом берём первый (т.е. самый близкий) результат.

    К своему коду адаптируешь самостоятельно.
    Ответ написан
    3 комментария
  • Как связать переменные i и result в функции range?

    Vindicar
    @Vindicar
    RTFM!
    Вместо перезаписи result собирай отдельные строки в список, а потом используй str.join() чтобы объединить список в одну длинную строку.
    Ответ написан
    Комментировать
  • Ошибка в aiogram :'cannot import name 'executor' from 'aiogram'', почему?

    Vindicar
    @Vindicar
    RTFM!
    Под какую версию aiogram код, и какая версия установлена у тебя? aiogram изменил API при переходе с версии 2 на версию 3.
    Ответ написан
    Комментировать
  • Как создать выпадающий список с данными из postgres на python?

    Vindicar
    @Vindicar
    RTFM!
    select "Route_num" from "Route TB"
    Во-первых, ты кавычки не перепутал? В SQL вроде имена столбцов и таблиц экранируются `бэктиками`, а не "кавычками".
    Во-вторых, ты просишь выбрать одно значение на каждой строке. Но в то же время обращаешься к item[1], т.е. ко второму элементу строки. Которого быть не может, так как ты выбираешь только один.
    Ответ написан
    6 комментариев
  • Как в машинном состоянии принимать несколько файлов?

    Vindicar
    @Vindicar
    RTFM!
    await FileSendingGroup.next() выполняет переход на следующее состояние.
    Если ты можешь понять, когда пользователь послал последний файл, выполняй этот переход только тогда.
    Ответ написан
  • Как в питоне вводить элементы массива одной строчкой через пробел?

    Vindicar
    @Vindicar
    RTFM!
    Вводишь строку и делаешь на ней str.split() с желаемым разделителем.
    Получаешь список кусочков строки, каждый преобразуешь как надо.
    Ответ написан
    1 комментарий
  • Как установить aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Какая версия питона? Вроде аиограм даже 3.11 не умеет ещё.
    Ответ написан
  • Есть ли какие то варианты вызвать деструктор принудительно кроме обязательного использования контекстного менеджера?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, ты вот так сходу это не реализуешь, потому что помимо вложенных словарей есть списки и другие коллекции, а также есть классы. Ты, конечно, можешь схитрить - сделать класс-прокси, который сигнализирует об изменениях при __setattr__() и __setitem()__, а также реализует вызовы __getattr__() и __getitem__() так, чтобы возвращать такой же прокси для целевого объекта.
    Условно:
    l = [1]
    d = {'a': l}
    pd = MyProxy(d)
    lst = pd['a']  # на самом деле lst это MyProxy(l, owner=pd)
    lst[0] = 2  # прокси-список реагирует на присваивание и оповещает владлеьца - прокси-словарь

    Но и это не очень хорошо, так как в примере выше я могу изменить список через ссылку l. Не говоря уже о проблемах с проверками типов данных. Так что сложно-составные структуры персистентными сделать малореально.

    Я бы сказал, вообще не очень хорошая идея реализовывать персистентность вот так.
    Вариант А: делай снапшоты в фиксированные моменты времени. Если сохранение снапшота слишком долгое, сделай клон через deepcopy и сохраняй клон, пока оригинал изменяется дальше.
    Вариант Б: явно сохраняй изменения, которые должны быть персистентными. Каждое в отдельности.
    Вариант В: Используй память, отображаемую на диск. Тогда ОС сама будет периодически сбрасывать изменившиеся страницы памяти на диск (хотя есть метод flush()).
    Но в этом случае может потребоваться изменить структуру данных, избавившись по максимуму от сложных объектов типа словарей и заменив их на простые массивы байт. Если нужны структуры, то их придётся распаковывать с помощью struct. Т.е. опять приходим к тому, что структура не должна быть сложной.
    Ответ написан
  • Является ли python-shell безопасным решением для запуска untrusted-кода на Node.js сервере?

    Vindicar
    @Vindicar
    RTFM!
    Не думаю, он создаёт дочерний процесс от ноды, но в доках не написано, что этому процессу задаются особые права - значит, права будут как у ноды.

    Я бы сделал минимум три уровня защиты:
    1. Полученный от пользователя скрипт выполняется не напрямую, а в скрипте-обёртке. Обёртка подписывается на события аудита Питона, и мониторит событие импорта. При попытке импорта модуля не из белого списка сигнализируем родительскому процессу и вызываем заранее сохранённую os._exit(), чтобы немедленно прибить интерпретатор. Также на обёртку можно возложить собственно прогон тестов.
    2. Скрипт-обёртка должен выполняться от nobody:nobody с правами только на временную директорию, в которой лежит сам скрипт и его виртуальное окружение. Директория должна пересоздаваться заново при каждом запуске скрипта. Может иметь смысл оформить выполнение обёртки внутри chroot.
    3. Выполнение должно происходить внутри контейнера, который должен перезапускаться время от времени (не обязательно при каждом запуске скрипта, можно раз в сутки или около того). Передача скрипта внутрь контейнер - через сетевой сервис, хотя можно и через примонтированную директорию. Внутри контейнера сервис сам создаёт временную директорию с окружением, переносит скрипт в эту директорию (с переименованием в заранее известное имя - user_script.py или подобное) и только тогда запускает обёртку.

    В этом случае атакующему нужно будет сначала обойти аудит импортов, потом сделать эскалацию привилегий, потом выбраться из-под chroot. И даже если он закрепится в контейнере, контейнер периодически перезапускается, так что малварь будет снесена.
    Ответ написан
    3 комментария
  • Как сравнить пустое значение из БД?

    Vindicar
    @Vindicar
    RTFM!
    Учи матчасть. Всё делается одним запросом.
    SELECT referal_id, COUNT(*) FROM users GROUP BY referal_id

    Группировка сделает так, что для каждого referal_id будет выведена одна строка, а групповые функции посчитают некий итог для каждой группы строк с одним и тем же значением referal_id. В частности, COUNT() посчитает сколько строк в группе.
    Ответ написан
    Комментировать
  • Как сделать такой функционал кнопок Telebot python?

    Vindicar
    @Vindicar
    RTFM!
    Отредактируй сообщение, при редактировании отправь новую разметку для кнопок?
    Ответ написан
    Комментировать
  • Почему не корректно работает код?

    Vindicar
    @Vindicar
    RTFM!
    for i in range(len(zones)):
                        pin = i + 2  # Номер пина соответствует номеру зоны + 1
                        if i+1 in in_zones:
                            # Если объект находится в зоне, зажигаем светодиод
                            board.digital[pin].write(1)
                        else:
                            pin = i + 2
                            # Если объект не находится в зоне, гасим светодиод  <--- НАПРАСНО
                            board.digital[pin].write(0)

    Косяк вот тут. Если текущий объект не находится в зоне, это не значит что никакой другой, ранее найденный объект не находится в этой зоне.
    Сделай массив bool по числу зон, в начале итерации выставь все элементы в false. По ходу итерации выставляй элемент в true если в зоне найден человек.
    В конце итерации выставляй светодиоды по элементам массива.
    Ответ написан
    1 комментарий
  • Почему не заканчивается цикл while true?

    Vindicar
    @Vindicar
    RTFM!
    В твоём коде break прервёт цикл for command in commands.
    Выполнение внешних двух циклов продолжится.
    Ответ написан
    Комментировать
  • Можно ли задать условия для работы opencv?

    Vindicar
    @Vindicar
    RTFM!
    Ну и в чём вопрос? У тебя в коде уже есть проверка на силу совпадения (сравнение найденного максимума силы с некоторым порогом). Если тебе нужно выполнять другое действие, то добавь ветку else туда.
    Если тебе нужно просто крутить цикл, и выполнять действие, когда изображение найдётся, можешь завернуть в цикл while тело red() или даже просто вызывать её саму в цикле. Условие завершения цикла обдумай сам, я без понятия что ты хочешь сделать.
    Ответ написан
    Комментировать
  • Как отправить аудиофайл в боте телеграм Python?

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

    Так что лучше ориентируйся так. sys.argv[0] содержит путь к скрипту, а модуль pathlib позволяет манипулировать путями.
    import sys
    from pathlib import Path
    
    BASE_DIR = Path(sys.argv[0]).parent.resolve()  # каталог скрипта
    AUDIO = BASE_DIR / 'audio.mp3'  # файл в каталоге скрипта
    #......
    async def send_songs(message):
        await message.answer("Hello!")
        await message.answer("World!")
        audio = AUDIO.open('rb')
        await bot.send_audio(message.chat.id, audio)
    Ответ написан
  • Как сохранить форматирование текста в боте Aiogram?

    Vindicar
    @Vindicar
    RTFM!
    У тебя какая версия aiogram, вторая или третья?
    Если вторая, то смотри параметр parse_mode у send_message().
    parse_mode (typing.Union[base.String, None]) – Send Markdown or HTML, if you want Telegram apps to show bold, italic, fixed-width text or inline URLs in your bot’s message.


    Насчёт третьей версии я не в курсе, но наверняка тоже надо parse_mode указать.
    Ответ написан