Ответы пользователя по тегу Python
  • Как прервать и перезапустить программу?

    Vindicar
    @Vindicar
    RTFM!
    if bet != 0 or 1 or 2:
    Ну конечно дословный перевод с русского на питон будет работать неправильно. Это условие интерпретируется как
    if (bet != 0) or (1) or (2):
    В питоне целые числа истинны, если они не нулевые. Т.е. получаем
    if (bet != 0) or (1 != 0) or (2 != 0):
    Как следствие
    if (bet != 0) or True or True:
    А как известно, X or True всегда даст True, независимо от значения X.
    Так что всё условие всегда даст True.
    Правильно или так:
    if (bet != 0) and (bet != 1) and (bet != 2):
    или так
    if bet not in (0, 1, 2):

    По поводу зацикливания - заверни кусок программы, отвечающий за ввод, в цикл while.
    Ответ написан
    Комментировать
  • Как ускорить работу Python в разы?

    Vindicar
    @Vindicar
    RTFM!
    Ты документацию читал?
    get_symbol_ticker(**params)[source]
    Latest price for a symbol or symbols.

    Выделение моё. Судя по докам, get_symbol_ticker() позволяет за один запрос получать инфу сразу о нескольких символах. Готов спорить, что это будет быстрее.

    Так как в заголовке функции **params вместо нормального описания параметров, я подозреваю, что переданные параметры пробрасываются прямиком в API binance. Открываем доки на это API, благо ссылка есть прямо в первых доках. Видимо, что можно в параметрах передать строку symbol, или строку-список symbols вида
    ["BTCUSDT","BNBUSDT"]. Как я понял, это именно строка такого вида, а не список.

    Вот скажи мне, что тебе помешало найти эту информацию самостоятельно? Две минуты гуглежа, и это при том что я с бинансом не работал вообще.

    Ну и да, серьёзно? f'{str(ticker1)}', притом что ticker1 - это уже заведомо строка? Больше строк богу строк...
    Ответ написан
    Комментировать
  • Как вызвать асинхронную функцию с синхронной функции?

    Vindicar
    @Vindicar
    RTFM!
    Если твой вызов асинхронной функции сводится к реакции на завершение выполнения синхронного кода, то используй run_in_executor(), он позволяет выносить код хоть в процесс, хоть в поток (смотря какой executor используешь), и оборачивает его в обычную асинхронную корутину, которую можно await-ить. Для простых случаев есть asyncio.to_thread(), но тут вопрос в природе выполняемого кода. CPU-bound код на питоне будет занимать GIL, тормозя остальные потоки (эта общая болезнь для потоков в питоне).

    А вообще есть асинхронные версии селениума, типа aioselenium или selenium-async. Можешь попробовать одну из них.

    Если же тебе нужно вызвать асинхронную корутину именно посреди синхронного кода в другом потоке, то run_coroutine_threadsafe() может помочь. Пример из доков на питон.
    async def coro_func():
         return await asyncio.sleep(1, 42)
    
    # Later in another OS thread:
    
    future = asyncio.run_coroutine_threadsafe(coro_func(), loop)
    # Wait for the result:
    result = future.result()
    Ответ написан
  • Как исправить str() takes at most 3 arguments (123 given)?

    Vindicar
    @Vindicar
    RTFM!
    Потому что непосредственное преобразование списка в строку всегда возвращает именно такой вид.
    А если тебе нужно соединить список строк разделителями, смотри в сторону str.join(), ну или сам итерируйся по списку и склеивай строки.
    Запрос в гугл тебе выше уже написали.
    Ответ написан
    Комментировать
  • Проблема с циклом while?

    Vindicar
    @Vindicar
    RTFM!
    else:
        logger.success(f'{current_otc} | The message was successfully sent')
        sleep_messages = random.randint(3, 7)
        logger.info(f"I will sleep {sleep_messages} seconds")
        time.sleep(sleep_messages)
        return  # <---- это прервёт выполнение функции. Сдаётся, мне, ты не этого хотел.
    Ответ написан
    Комментировать
  • Можно ли внутри асинхронных функций запускать обычные?

    Vindicar
    @Vindicar
    RTFM!
    Да, можно, если они кратковременные.

    Идея асинхронности в питоне проста как две копейки: асинхронные функции выполняются в рамках однопоточного рабочего цикла (loop), и умеют сказать ему "когда вот эта операция закончится - продолжи выполнять меня. А пока займись чем-нибудь" (await-вызов).

    Соответственно, пока асинхронная функция выполняет синхронный код, т.е. код между await'ами (ну и началом/завершением в т.ч.), рабочий цикл не может выполнять никакую другую асинхронную функцию. Это плюс, так как не приходится беспокоиться из-за одновременного доступа, как при работе через потоки. Но минус в том, что долгие синхронные операции не позволяют циклу выполнять другие асинхронные функции, т.е. реагировать на внешние события.

    Отсюда вывод: если твой синхронный код выполняется быстро - его можно вызывать из асинхронных функций без проблем. Если это длительный (блокирующий) код - его либо нужно заменить асинхронным, либо засунуть в отдельный поток с помощью run_in_executor(), либо на худой конец разбавить вызовами await asyncio.sleep(0). Такой вызов просто возвращает управление в рабочий цикл, чтобы тот мог разобраться с текущими делами, а потом вернуться и продолжить выполнение этой асинхронной функции.

    Обращения к БД на малых объёмах и малых нагрузках не слишком длительны. Если очень надо, есть асинхронный aiosqlite.
    Ответ написан
    Комментировать
  • Как задать формат вывода для типа float по умолчанию?

    Vindicar
    @Vindicar
    RTFM!
    Нет. Можно вынести формат в строковую переменную и использовать её для форматирования при выводе.
    Ответ написан
    Комментировать
  • Как вывести фото на экран?

    Vindicar
    @Vindicar
    RTFM!
    Заголовок Content-Type попробуй прописать, в конструкторе Response. Без него сервер не знает, что ты отдаёшь, и отдаёт контент как application/octet-stream, т.е. какой-то произвольный бинарный блоб. А такие вещи браузер может только сохранить.
    Тебе нужно знать формат твоего файла, и отдать правильный content type, например, image/jpeg.
    Ответ написан
    1 комментарий
  • Как отследить изменения поля класса, если это список?

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

    Альтернативно, спрячь список (сделай приватным) и сделай в классе публичные методы работы с ним: получение по индексу, задание по индексу, добавление, удаление.
    Ответ написан
    Комментировать
  • Почему возникает ошибка TypeError: join() argument must be str, bytes, or os.PathLike object, not 'int'?

    Vindicar
    @Vindicar
    RTFM!
    Ты где-то передал число вместо строки. Судя по трейсбеку, ведущему в clickupython, где-то при вызове методов ClickUpClient. Читай документацию, сверяй типы данных с тем, что ты реально передаёшь.
    Ответ написан
    Комментировать
  • Почему выдаёт ошибку с @bot?

    Vindicar
    @Vindicar
    RTFM!
    Блин, еще раз - текст ошибки угадывать нужно?
    Вбил в гугл "@bot.callback_query_handlers", он подсказывает, что наверно нужно "@bot.callback_query_handler" (в конце нет буквы S).
    Ответ написан
    Комментировать
  • Как раскодировать request?

    Vindicar
    @Vindicar
    RTFM!
    Это обычное указание символа по коду, принятое в XML (и как его подмножество, в HTML).
    import html
    print(html.unescape('&#1087;&#1080;'))
    Ответ написан
    Комментировать
  • Как составить из букв слово?

    Vindicar
    @Vindicar
    RTFM!
    0. Скачай откуда-нибудь подходящий список существующих слов.
    1. Отсей слова, которые начинаются не на одну из заданных букв.
    2. Если кажду букву надо использовать ровно один раз, отсей слова, у которых длина не подходит.
    3. В оставшихся словах отсортируй буквы и сравнивай результат с отсортированным списком данных букв. Это если каждая буква используется один раз. Если буквы могут повторяться, то сделай множество букв слова и множество данных букв, и сравнивай их.
    Ответ написан
    Комментировать
  • Как решить проблему с SQLite3?

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

    А твоя GetInfo() не работает. Почему? Внезапно, в SQL сравнение - это =, а не ==. А ошибку тебе не пишет, потому что ты сделал except: pass. За такую практику вообще надо бить по пальцам линейкой, надеюсь, ты теперь понял почему.
    Ну и до кучи, если хочешь проверить существование, то лучше сделать запрос вида SELECT COUNT(*) FROM main WHERE user_id = ? или
    SELECT EXISTS(SELECT * FROM main WHERE user_id = ?)
    . Эти запросы гарантированно вернут одну строку с одним значением, 0 или 1. 0 - строка не существует, 1 - строка существует.
    Ответ написан
    1 комментарий
  • Как или с помощью чего сделать Telegram бота, который выполняет скрипт по заданному времени?

    Vindicar
    @Vindicar
    RTFM!
    aioschedule посмотри.
    Ответ написан
    Комментировать
  • Как отменить, отображение текста, при пересылке?

    Vindicar
    @Vindicar
    RTFM!
    Очевидно, сначала проверять на форвард, потом уже писать текст. Поменяй блоки местами
    А вообще какой потаённый смысл в первом if, если у тебя все ветки одинаковые? Почему не написать составное условие?
    Ответ написан
    Комментировать
  • Как расчитать кол-во вариантов при рандомизации текста?

    Vindicar
    @Vindicar
    RTFM!
    Обозначим одну подстановку как "терм", и допустим, что все варианты в терме уникальны (т.е. нет повторений внутри одного терма).
    Для терма {} количество комбинаций равно количеству вариантов в терме.
    Для терма [] количество комбинаций равно количеству перестановок вариантов в терме, т.е. факториал от количества комбинаций.
    Для всего выражения количество комбинаций должно быть равно произведению количеств комбинаций для каждого терма.

    С вложенными вариантами чуть сложнее.
    Для {} количество вариантов это по сути сумма их весов.
    Для [] количество вариантов считается так: количество перестановок вариантов, умноженное на произведение весов вариантов.
    У простой строки вес 1, у вложенного терма вес равен количеству его комбинаций.
    Таким образом, можно посчитать число комбинаций рекурсивно.

    import math
    
    class RandomChoice(list):
        pass
    
    class RandomOrder(list):
        pass
    
    def random_choice(options) -> int:
        total = 0
        for option in options:
            if isinstance(option, RandomChoice):  # вложенный выбор варианта
                total += random_choice(option)
            elif isinstance(option, RandomOrder):  # вложенное переупорядочивание
                total += random_order(option)
            else:
                total += 1
        return total
    
    def random_order(options) -> int:
        total = math.factorial(len(options))
        for option in options:
            if isinstance(option, RandomChoice):  # вложенный выбор варианта
                total *= random_choice(option)
            elif isinstance(option, RandomOrder):  # вложенное переупорядочивание
                total *= random_order(option)
            # а для просто варианта ничего делать не надо
        return total
    
    def total_count(items) -> int:
        total = 1
        for item in items:
            if isinstance(item, RandomChoice):  # вложенный выбор варианта
                total *= random_choice(item)
            elif isinstance(item, RandomOrder):  # вложенное переупорядочивание
                total *= random_order(item)
        return total
    
    sample = [
        'я', 
        RandomChoice(['купил', 'приобрел']), # 2
        RandomChoice(['на ярмарке','на рынке','в магазе']), # 3
        RandomChoice(['сыр', #8
            RandomOrder(['соль, ','хлеб, ','муку, ']), # 6
            'сахар']),
    ]
    
    
    combos = total_count(sample)
    print(combos)
    Ответ написан
    3 комментария
  • Как искать по ключам в словаре?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, словари на то и словари, чтобы находить значение по ключу.
    some_dict = {
    0: 'foo',
    1: 'bar',
    2: 'baz',
    }
    
    key = 1
    print(some_dict[key])


    Во-вторых, а что за значение ты используешь в качестве ключа (lvl)? Ты уверен, что оно корректное?
    Ответ написан
  • Какой самый легкий путь для создания модели с помощью машинного обучения?

    Vindicar
    @Vindicar
    RTFM!
    Не использовать машинное обучение, а сначала попробовать другие методы.
    Если искомый объект подвергается только параллельному переносу, пробуй поиск по шаблону (opencv template matching).
    Если он контрастен и также подвергается повороту и масштабированию, можешь искать по локальным особенностям (opencv feature matching).
    Если известно максимальное смещение за кадр, можешь ускорить код, ведя поиск объекта только в окрестности предыдущего расположения.

    И только если у тебя целая категория разнообразных, но похожих объектов, и ты готов предоставить неколько десятков тысяч изображений как с наличием, так и с отсутствием искомого объекта, только тогда стоит задумываться о машинном обучении.
    Ответ написан
  • Как автоматизировать отправку сообщения в Телеграм на Python?

    Vindicar
    @Vindicar
    RTFM!
    aiogram для написания телеграм-бота.
    aioschedule, чтобы не велосипедить планировщик.
    Ответ написан
    Комментировать