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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    На firstvds.ru уже несколько лет держу минимальную машинку за ~200р/мес.
    Хватает на небольшой сайт на вордпрессе, тррентокачалку, раздачу аудиокниг родственникам в виде mp3 и rss фидов, и, иногда, даже майнкрафт сервер на нём поднимаю на троих детя.
    Всё запускается в докер-контейнерах. Сам в шоке, что оно там ещё и шевелится и помещается в памяти.
    Даже засомневлся, но нет, действительно гиг оперативы.
    В общем берите минимальную тачку на KVM в пробном режиме, если всё заведётся и поместится, просто будете платить, а нет - выберете машину помощнее. Мало ли что ваш бот там делает, может картинки нейронной сеткой обрабатывает...
    Есть несколько ресурсов в сети, которые помогают выбрать VPS. Вот попался с первой попытки: https://poiskvps.ru/
    Ответ написан
    Комментировать
  • Как реализовать проверку чисел на близость?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    min(x/num[-1] for x in num[:-1])
    Но что вы этим хотели добиться. я так и не понял: num.*
    Ответ написан
    2 комментария
  • Чему равен параметр i после объявления lambda функции?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    После объявления ничему.
    Функци в питоне - это объект первого рода, до её вызова аргументы не определены и контекст не создан, а создаётся контекст при каждом вызове.
    Ответ написан
    2 комментария
  • Как задеплоить телеграм бота на VPS?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    На винде запускать - это бред.
    Если на VPS планируете держать только бота, то лучше оформить его в виде пакета. Настройте CI\CD и он сам будет развёртываться на вашем сервере прикаждом релизе в системе контроля версий.
    Лично я разворачиваю бота в докере, потому что боту обычно нужна БД, какие-то приложения рядом... Всё установть и настроить - это отдельная история и спустя пару лет бесперебойной работы вам или вашему заказчику, возможно, придётся переехать на другой хостинг или переустановить и настроить все заново, а из памяти всё уже выветрилось. Спасает описание всей конфигурации в виде docker-compose.
    Тогда переезд на ноый сервер вообще тривиален. Также легко поднять тестовый клон бота на локальной машине для отладки и работать он будет в той же среде и с той же конфигурацией, что и на сервере.
    Особенно это удобно, если приходится приментяь какие-то конвертеры графики или звука.

    Если надо поднять дв абота на разных фреймворках или с разными зависимостями, то докеризация тоже спасает от необходимости возиться с venv. А зависимости бывают еще и у сторонних внешних утлит.
    Ответ написан
    Комментировать
  • Как ускорить код?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Можно заменить список на множество для начала:
    def checkPrime(start, end):  
        numbers = set(range(start, end + 1))  
        for i in range(2, int(end ** 0.5) + 1):  
            for j in range(i * i, end + 1, i):  
                numbers.discard(j)  
        return sorted(numbers)

    Если упорядоченность не нужна, то можно и сортировку убрать.
    Ответ написан
    6 комментариев
  • Найдите все пифагоровы тройки, в которых все числа находятся в диапазоне [1; 5000]?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Начните с самого простого не оптимизированного решения:
    Вам нужно перебрать все целые A от 1 до 5000. Для каждого такого A вы можете перебрать все целые B от A+1 до 5000. Если корень из суммы их квадратов - целое число, то это, очевидно, тройка пифагора. Но вам нужно, чтобы C было меньше или равно 5000.
    Для отимизации вы можете не спешить извлекать корень, а сперва проверить его на превышение 5000*"2. Так вы немного сэкономите. Ещё вы каждый раз можете вычислять правую границу внутреннего цикла, так вы будете искать решение среди вдвое меньшего количества вариантов.
    Не знаю какие там требования сейчас по эффективности решения задачь, но для школьников такое решение я бы считал приемлемым. Да и не для школьников. Хотя н апитоне такая задача будет считаться с десяток секунд без оптимизаций. Однако временнЫе ограничения не были озвучены. Эдак и методом Монтекарло можно решать=)
    Ответ написан
    7 комментариев
  • Как найти и забрать нужные данные из json?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Что значит разная вложенность?
    Покажите какие монстры получаются и в чем конкретно проблема? Задача-то тривиальная: пройти циклом по списку, проверять условие и выдавать результаты через yeld, или собиать их в коллекцию.
    Ответ написан
    Комментировать
  • Как достать ссылку?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Так, например.
    py "json.load(urllib.request.urlopen('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY&date=2017-09-24'))['url']"
    Ответ написан
    Комментировать
  • Как сделать что-то если наступил следующий день/неделя/месяц/год на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А в чем проблема?
    Для начла получи точные дату и время необходимого события. Для этого прибавляй один день\неделю\месяц\год к текущей дате. Затем нужно вернуться к началу этого очередного интервала (дня\недели\месяца\года). В случае дня нужно отбосить время. В случае недели, нужно отбросить время и найти ближайший понедельник слева - то есть вычесть из даты номер дня недели. В случае месяца, нужно вычесть из даты номер дня месяца, в случае года - номер дня года соответственно.

    Получившиеся дата-время события теперь нужно не пропустить.
    Просто время от времени проверяем дату-время и если она больше или равна требуемому, генерируем ивент.
    Можно вычесть текущую дату-время из даты-времени события, если этот промежуток меньше порогового, то спать ровно этот промежуток, если больше, то спать пороговое время и следом повторть проверку.

    Високосные секунды можно не учитывать, если вы не работаете с интервалами меньше минуты.
    Перевод часов можно не учитывать, если не работаете с интервалами меньше суток. Иначе вам придётся оределить как должна вести себя программа при этих переводах.
    Ответ написан
    Комментировать
  • В чем проблема работы данного кода?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Представьте. что у вас уже есть на текущий момент самое большое и предыдущее самое большое число из всех, что попадались до сих пор. И вот вы нащли число, которое больше самого большого. Очевидно. что предыдущее самое большое надо подвинуть, а вы этого не делаете.

    Такие задачи проще всего решать начиная со штатной ситуации, а потом отрабатывать исключенияи специфические кейсы.
    Нарисуйте цепочку чисел, укажите стрелочкой на текущее и для этой позиции вручную найдите саоме большое и предыдущее. Потом подумайте какие будете делать операции.
    Ответ написан
    1 комментарий
  • Как sys.stdin, который выглядит как словарь превратить в словарь?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Так делать нельзя:
    dict = json.loads(str(sys.stdin))
    Нужно либо так:
    dict = json.load(sys.stdin)
    либо так:
    dict = json.loads(sys.stdin.read())
    Приведите остальной код тоже. Там наверняка такие же ошибки.
    Ответ написан
    Комментировать
  • Как перепарсить словарь python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Элементарно. Итерируйтесь по парам ключ-значение уидов и по соответствующим ключам запрашивайте в словаре дат нужные даты, формируйте новые словари и складывайте их в список. результат дампьте в json.

    Если вам не понятны эти слова, то вам рано решать эту задачу самостоятельно, следует подучить питон или идтик фрилансерам.
    Ответ написан
    Комментировать
  • Как посчитать количество суб-объектов в Python для каждого XML-объекта?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы можете сделать это за два прохода.
    На первом проходе просто собираете множество всех возможных уникальных тегов. Я бы просто записывал в словарь True по ключу, равному имени каждого попавшегося тега на первом проходе.
    В результате вы получите словарь уникальными именами в ключах, причем эти ключи будут в том порядке, в каком они встречались в XML (иногда это просто удобно, что они не в рандомном порядке).
    Имея общий набор имён вы можете воспользоваться стандартным способом записи в CSV в виде словарей.
    Останется лишь конвертировать каждый узел из вашего файла в словарь. Никаких сторонних библиотек не нужно.
    Ответ написан
    1 комментарий
  • Обращение к записи БД требует некоторой обработки. Что лучше: обработать в скрипте, который обратился, или в хранимой процедуре в БД?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Прежде чем всё это усложнять описанным вами способом, необходимо определиться с ожидаемыми количествами. Насколько много всего будет переменных, насколько много может быть этих объектов, какие ожидаются частоты этих ваших обращений.
    Ещё нужно определиться как вы планируете редактировать наборы изменяемых переменных. Запишете прямо в БД руками, или нужно делать API для редактирования списков?
    Вы собираетесь скрипт запускать при каждом поступлении новой порции данных? Может правильнее запустить его на ожидание порций из пайпа? Или АПИ сделать поверх http.

    По существу вопроса. Минус хранимых процедур в том, что это код, который хранится вместе с данными. Нужно делать отдельные специфические "приседания", чтобы правильно деплоить и обновлять такой код, хранить его в системе контроля версий, мигрировать от версии к версии...
    Быстродействие в обоих случаях будет зависеть от конкретных действий, которые вы будете каждый раз повторять при "обращениях". Однако при наличии "бутылочного горлышка" в этом месте при реализации через хранимые процедуры вы уже мало что там можете сделать. А вот в коде на питоне можно при необходимости добавить воркеров и таски на длительные операции передавать им через очередь.

    В целом задача звучит так, будто делать её надо максимально простым способом без предварительной оптимизации, которая, скорее всего, и не пригодится. Оптимизировать нужно по факту, когда понятно станет где будут проблемные места.
    Ответ написан
    Комментировать
  • Автоматизация верстки в полиграфии, поможете)?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Я похожие задачи решал так:
    - В Inkscape готовился макет документа в svg-формате. Внутри SVG - это обычный текстовый XML-файл.
    - Потом на его основе строился шаблон, мы использовали стандартный шаблонизатор джанго, но можно взять и сторонний, например Jinja или любой другой, тысячи их. У нас структура документа была гораздо сложнее вашей и я использовал многоуровневые шаблоны для разных фрагментов документа. Да, WISIWIG редактирования шаблонов добиться не получилось, но такая задача была не критичной. В вашем случае шаблон получается тривиальным и можно даже подстановку делать на уровне строк, только экранирование нужно аккуратно сделать.

    Это всё лет десять назад уже делалось. Сейчас может быть есть инструменты поудобнее. Не следил за новостями в этом направлении.
    - Далее шаблон рендерится заполняясь данными из контекста, и итоговый SVG-документ обрабатывается headless инстансом редактора Inkscape, который крутился на отдельной виртуалке, а позднее запускался в docker-контейнере. Это фактически запуск Inkscape -A document.svg document.pdf, при котором документ преобразуется в pdf-файл.
    В итоге полученные pdf опционально собираются в один, чтобы сделать многостраничный документ и его удобнее было печатать. Не помню какая библиотека для этого использовалась, но задача распространённая и простая, найдёте.
    Ответ написан
    Комментировать
  • OSError: [WinError 193] %1 не является приложением Win32 - как решить?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Нужно посмотреть что у вас в "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\site-packages\numpy\_distributor_init.py"
    Откуда берется значение filename. Возможно туда попадает не путь к dll, а плейсхолдер %1 из какого-нибудь скрипта при некорректной установке библиотеки.
    Ответ написан
    Комментировать
  • Как проще всего представить простой форматированный текст в Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Какие-то у вас требования сранные. Кому будет утомительно? Вы вручную конвертировать планируете? Или остерегаетесь по поводу алгоритмической сложности преобразования? Конвертация - это изолированная и хорошо тестируемая задача. Разметка на основе XML даст вам максимальную гибкость и универсальность, всегда можно игнорировать те или иные возможности форматирования и не потерять какие-то нюансы. Можно надобавлять свои неймспейсы и атрибуты в них. Маркдаун такого гарантировать не сможет.
    Что значит "по дереву тегов набегаешься"? Вы в ручную бегать собираетесь?
    Куда и зачем вам надо конвертировать? Как-то эту важную часть вы оставили за скобками.
    Обратно тоже потребуется? Есть ли требование идентичности при двойном преобразовании?
    Используйте XML и не морочьте себе голову. Общий формат должен быть максимально строгим, документированным, однозначным и универсальным. Лучше XML вы тут ничего не найдёте. Если в какой-то момент у вас в одном из форматов встретится какое-то особое форматирование (подчеркивание волнистой линией какое-нибудь), то в XML добавить новый тег или атрибут не составит труда, чтобы сохранить информацию и не нарушить обратную совместимость, а вот с зоопарком диалектов маркдауна вы намучаетесь изрядно.
    Ответ написан
    Комментировать
  • Как упростить однострочный if?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    CONVERSATION2PEER_GAP = 2_000_000_000
    conversation_id = int(conversation_id)  # Почему у вас где-то идентификаторы хранятся интом,
    # а где-то текстом? Нужно стремиться к стандартизации и избегать таких неконсистентных нюансов.
    # Если там не может быть другого текста, то следует приводить к числу сразу когда возможно.
    peer_id = event.object['message']['peer_id']
    if peer_id != conversation_id + CONVERSATION2PEER_GAP:
         continue
    Ответ написан
    Комментировать
  • Как из строки восстановить список?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ещё можно сериализовать\десериализлвать этот список в \из json.
    huge_string = json.dumps(huge_list)
    restored_list = json.loads(huge_string)
    Ответ написан
    Комментировать
  • Как сохранить JSON с кириллицей, чтобы она читалась?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Почитайте спецификацию. Если вы не научитесь этим пользоваться, то не сможете программировать.

    Help on function dumps in module json:
    
    dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
        Serialize ``obj`` to a JSON formatted ``str``.
        
        If ``skipkeys`` is true then ``dict`` keys that are not basic types
        (``str``, ``int``, ``float``, ``bool``, ``None``) will be skipped
        instead of raising a ``TypeError``.
        
        If ``ensure_ascii`` is false, then the return value can contain non-ASCII
        characters if they appear in strings contained in ``obj``. Otherwise, all
        such characters are escaped in JSON strings.
        
        If ``check_circular`` is false, then the circular reference check
        for container types will be skipped and a circular reference will
        result in an ``OverflowError`` (or worse).
        
        If ``allow_nan`` is false, then it will be a ``ValueError`` to
        serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in
        strict compliance of the JSON specification, instead of using the
        JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).
        
        If ``indent`` is a non-negative integer, then JSON array elements and
        object members will be pretty-printed with that indent level. An indent
        level of 0 will only insert newlines. ``None`` is the most compact
        representation.
        
        If specified, ``separators`` should be an ``(item_separator, key_separator)``
        tuple.  The default is ``(', ', ': ')`` if *indent* is ``None`` and
        ``(',', ': ')`` otherwise.  To get the most compact JSON representation,
        you should specify ``(',', ':')`` to eliminate whitespace.
        
        ``default(obj)`` is a function that should return a serializable version
        of obj or raise TypeError. The default simply raises TypeError.
        
        If *sort_keys* is true (default: ``False``), then the output of
        dictionaries will be sorted by key.
        
        To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
        ``.default()`` method to serialize additional types), specify it with
        the ``cls`` kwarg; otherwise ``JSONEncoder`` is used.
    Ответ написан
    Комментировать