Задать вопрос
  • Как динамически создавать таблицы при помощи Peewee в Python?

    Vindicar
    @Vindicar
    RTFM!
    динамически меняющееся количество столбцов

    You are doing it wrong. (c)
    Если тебе требуется динамически меняющееся количество столбцов, ты неправильно спроектировал базу данных.
    Лучше опиши задачу, которую ты пытаешься решить.
    Ответ написан
  • Как записать в список?

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

    Vindicar
    @Vindicar
    RTFM!
    s2 = word
    Ты перезаписываешь s2 последним найденным словом. Вместо этого заведи список, и складывай найденные слова в список через метод .append().
    Ответ написан
    Комментировать
  • /tmp/id_rsa.pub: open for write: permission denied?

    Vindicar
    @Vindicar
    RTFM!
    Наверно, файл /tmp/id_rsa.pub остался со времени установки ключа для root, и был создан с правами root. Поэтому пользователь, под которым работает FTP-сервер, его не может открыть для перезаписи. Если файл не нужен, удали его из-под рута, и попробуй еще раз.
    Ответ написан
    Комментировать
  • Как реализовать settings.py?

    Vindicar
    @Vindicar
    RTFM!
    Я для таких вещей люблю использовать JSON и датаклассы. Хорошо работает, если у тебя в настройках только простые типы (целое число, дробное число, строка, булево значение), из коллекций - списки.
    Описываешь настройки как датакласс
    import dataclasses
    
    @dataclasses.dataclass
    class Settings:
        x: int = 0  # имя, тип настройки, значение по умолчанию
        y: int = 0
        name: str = "Безымянный"

    Тогда загрузку из файла можно сделать так:
    import sys
    import pathlib
    import json
    
    # я предполагаю, что ты будешь хранить настройки в каталоге скрипта
    APP_DIR = pathlib.Path(sys.argv[0]).parent.resolve()  # путь к каталогу скрипта
    CFG = APP_DIR / 'settings.json'  # путь к файлу конфига
    settings = Settings()  # создаём настройки по умолчанию
    try:
        with CFG.open('rt', encoding='utf-8') as cfg:  # открываем файл (закроется сам по выходу из with)
            data = json.load(cfg)  # разбираем файл как JSON
        settings = dataclasses.replace(settings, **data)  # обновляем настройки значениями из файла
    except Exception as err:
        print('Ошибка загрузки настроек:', err)  # выводим сообщение об ошибке
    # но выполнение кода продолжается в любом случае
    # у нас есть либо settings с значениями по умолчанию, либо settings, обновлённый из файла
    print(settings.name, settings.x, settings.y)  # пример использования объекта settings
    settings.name = 'Имя'  # значения в объекте можно менять
    settings.x, settings.y = 10, 20


    Для сохранения можно будет аналогично вытащить значения всех полей из объекта:
    try:
        data = dataclasses.asdict(settings)  # превращаем объект в словарь
        with CFG.open('wt', encoding='utf-8') as cfg:  # открываем файл (закроется сам по выходу из with)
            json.dump(data, cfg, ensure_ascii=False, indent='  ')  # записываем словарь в файл в формате JSON
    except Exception as err:
        print('Ошибка сохранения настроек:', err)  # выводим сообщение об ошибке
    Ответ написан
    Комментировать
  • Как отделить числа от букв в списке?

    Vindicar
    @Vindicar
    RTFM!
    Пробуй перевести в int, лови исключение ValueError. В зависимости от исхода (было/не было) добавляй в итоговый список новый элемент.
    Ответ написан
    Комментировать
  • Как повысить четкость распознавания текста tesseract?

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

    Vindicar
    @Vindicar
    RTFM!
    если sys.getsizeof и метод __sizeof__() для обоих списков показывают одинаковое значение

    Читай документацию!
    Only the memory consumption directly attributed to the object is accounted for, not the memory consumption of objects it refers to.

    Два списка одного размера занимают одинаковый объём памяти, а вот их элементы в этот объём не входят, их надо считать отдельно. Там-то и будет засада.

    Интернированные объекты - это своего рода синглтоны, они существуют в единственном экземпляре, и при создании через литерал вместо создания нового объекта переиспользуется старый. Разумеется, это подразумевает, что объект неизменяемый.
    Ответ написан
    Комментировать
  • Как сделать замену по шаблону?

    Vindicar
    @Vindicar
    RTFM!
    В регулярных выражениях [ и ] - спецсимволы, так что если ты хочешь их использовать как литералы, их нужно экранировать: r'\[/?\w+\]'
    Ответ написан
    Комментировать
  • Как передать объёмные файлы через websocket?

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

    Vindicar
    @Vindicar
    RTFM!
    Использовать time.time() не хочется, чтобы избежать конфликта с Телеграм при неправильно установленном времени на локальной машине пользователя.

    Тогда только спрашивать время у какого-то доверенного сервера, по NTP или иному протоколу.
    Ответ написан
  • Как сделать инлайн кнопки?

    Vindicar
    @Vindicar
    RTFM!
    Чего ты не можешь понять?
    Каждый вызов row() принимает в параметрах те кнопки, которые должны быть в одном ряду.
    Просто сделай нужное количество вызовов row(), передав каждому те кнопки, которые должны быть в соответствующем ряду.
    btn1 = InlineKeyboardButton(......)
    btn2 = InlineKeyboardButton(......)
    btn3 = InlineKeyboardButton(......)
    ...
    keyboard.row(btn1, btn2)
    keyboard.row(btn3)
    ...
    Ответ написан
    Комментировать
  • Как продолжить работу бота?

    Vindicar
    @Vindicar
    RTFM!
    Потому что надо документацию читать, и понимать, за что отвечает параметр func в callback_query_handler(), а не перепечатывать с ютуба.
    Для общего понимания можешь глянуть мой старый ответ.
    Если коротко, ты сам сказал телеботу, что full_calc() должна обрабатывать ВСЕ нажатия на кнопки.
    Ответ написан
  • Почему fetch в ответе возвращает promise, а не объект?

    Vindicar
    @Vindicar
    RTFM!
    Потому что Response наверняка содержит только заголовки и статус ответа, а сам ответ ещё не скачан. blob(), text() и json() его скачивают и разбирают, а скачивание как раз и требует промис, чтобы не подвешивать браузер.
    Ответ написан
    Комментировать
  • Как скачать и установить шрифты в html?

    Vindicar
    @Vindicar
    RTFM!
    Когда у меня встала такая задача, я загнал шрифт в CSS файл.
    @font-face {
    	font-family: 'My Super Font';
    	src: url('data:application/octet-stream;base64,тут-идёт-woff-файл-шрифта-в-base64') format('woff');
    	font-weight: normal;
    	font-style: normal;
    }

    Ну и конечно, можно загнать сам CSS внутрь HTML через тег style. Хотя это изврат будет.
    Ответ написан
    Комментировать
  • Как вставить строку на индекс, вне зависимости от того существует он или нет?

    Vindicar
    @Vindicar
    RTFM!
    l[2:] = ['Test']
    Для двух-трёх строк сработает.
    Ответ написан
    Комментировать
  • Почему возникает ошибка в telethon?

    Vindicar
    @Vindicar
    RTFM!
    Вообще не разбираюсь в асинхронных вещах.

    Откладываешь бота, разбираешься как следует, возвращаешься к боту. Без понимания этого механизма бота сложнее hello world не написать.

    В чем может быть дело?

    Для работы асинхронного кода он должен быть запущен через рабочий цикл (т.н. реактор, в терминах asyncio - event loop). Этот цикл обычно занимает тот поток, где он создан, и поочерёдно планирует выполнение вызванных корутин (async функций). Когда корутина делает await-вызов, она приостанавливается, а реактор занимается другими делами (в частности, выполняет этот вызов), пока вызов не завершится. После чего корутина продолжает работу.
    asyncio создаёт реактор автоматически для главного потока, но не для вспомогательных потоков. Просто потому, что обычно весь код асинхронного приложения работает в рамках реактора, а иметь несколько реакторов в разных потоках - это извращение. Но если очень нужно, ты можешь вызвать asyncio.new_event_loop() в твоём новом потоке, чтобы создать реактор, а потом задать этот реактор для потока вызовом asyncio.set_event_loop() (в этом же потоке). И только после этого запускать там асинхронный код.
    Ответ написан
    Комментировать
  • Удаление help в discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Читай документацию, там написано, что нужно сделать.
    И есть отдельный раздел про реализацию своей справки.
    Ответ написан
    4 комментария
  • Ошибка в боте пайтон как исправить?

    Vindicar
    @Vindicar
    RTFM!
    У тебя библиотека использует f-строки. Они были добавлены с Python 3.6, а ты используешь лежалый 3.5.
    Если так нужна 32-разрядная версия, поставь хотя бы 3.7. А лучше перейди на x64 и ставь что-то поновее.
    Ну и да, научись выделять текст в терминале, или хотя бы пользоваться клавишей Print Screen.
    Ответ написан
    Комментировать
  • Как работает random.choices с weights?

    Vindicar
    @Vindicar
    RTFM!
    В документации написано:
    If a weights sequence is specified, selections are made according to the relative weights

    Относительные веса означают, что если вес одного элемента вдвое больше другого, он будет выбран с двое большей вероятностью. Т.е. считай, что веса нормализуются - делятся на сумму весов, и полученные частные и будут вероятностями.
    Ответ написан
    Комментировать