Задать вопрос
  • Как вписать в replace() два символа заменить одним?

    Vindicar
    @Vindicar
    RTFM!
    Используй str.maketrans() чтобы создать таблицу подстановок, и str.translate() чтобы применить её к строке.
    Плюс в том, что с помощью translate() можно также легко проворачивать замены вида "заменить X на Y, и одновременно заменить Y на X".
    Ответ написан
    1 комментарий
  • Почему в одном проекте импорты работают, а в другом нет?

    Vindicar
    @Vindicar
    RTFM!
    может потому что винда находит pip3 в PATH и использует его?
    Попробуй указать прямой путь до pip3 в конкретном venv.
    Ответ написан
  • Как нажать и держать кнопку?

    Vindicar
    @Vindicar
    RTFM!
    Кнопку мыши?
    Послать событие mouse down, подождать сколько надо держать, послать mouse up.
    Точные методы не вспомню, нужно рыться в документации на selenium.
    Ответ написан
    Комментировать
  • Как грамотно использовать progress bar в коде?

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

    pb.config(value=format(per))
    win.update_idletasks()
    Ответ написан
  • Как сделать скриншот элемента на странице с помощью Python и необходимых для этого библиотек?

    Vindicar
    @Vindicar
    RTFM!
    Именно скриншотом, т.е. картинкой? Тогда selenium в руки.
    Ответ написан
    Комментировать
  • Как вывести все слова строки, содержащие нечетное количество букв относительно центра слова?

    Vindicar
    @Vindicar
    RTFM!
    for i in a:

    Если применить оператор for к списку, он перечисляет элементы списка, а не индексы.
    Так что не len(a[i]) а len(i)
    Ответ написан
    Комментировать
  • Как найти все URL и URI внутри HTML с помощью Python?

    Vindicar
    @Vindicar
    RTFM!
    Я бы всё же копал в сторону регулярок. Слишком уж много мест где URL могут встретиться.
    Так что я бы сказал примерно такое...
    (["'])(https?://.+?)\1
    Т.е. "в начале кавычка или апостроф, затем что-то, начинающееся с http:// или https://, потом любые символы, но как можно меньше, а потом тот же символ что и в начале".
    Написал маленький скрипт, натравил его на исходник этой страницы - по-моему, работает неплохо.
    Ответ написан
  • Как отслеживать посетителей на сайте, которые перешли из мессенджеров?

    Vindicar
    @Vindicar
    RTFM!
    document.referer - на клиентской стороне.
    На серверной стороне - HTTP-заголовок Referer.
    А вообще - нет, способа нет, так как ссылки во внешних приложениях не дают Referer.
    Есть обходные пути.
    1. Включать в ссылку какой-то referer ID, тогда можно будет отследить, кто перешел на сайте по этой конкретной ссылке.
    2. Если мессенджер использует страницу с предупреждением о переходе по ссылке (как Steam, например), то тогда переход будет с этой страницы, и его можно будет отследить. Но это зависит от мессенджера.
    Ответ написан
    Комментировать
  • Как реализовать мульти-поточность в боте Telegram (Aiogram)?

    Vindicar
    @Vindicar
    RTFM!
    Мешать многопоточность с асинхронностью - плохая идея.
    А вообще зависит от реализации server.status(). Если оно делает синхронный сетевой запрос, то конечно бот встанет на время его выполнения.
    Если нет асинхронной реализации, я бы запустил новый таск, который в цикле раз в минуту-две опрашивает сервер и запоминает текущий онлайн. А по команде отдавал бы только последнее запомненное значение.
    В принципе можно использовать loop.run_in_executor() для выполнения потока как асинхронной задачи. Это более-менее безопасно.
    Ответ написан
    Комментировать
  • Как исправить ошибку питон?

    Vindicar
    @Vindicar
    RTFM!
    А ты уверен, что браузер делает DNS запрос к домену?
    У него может быть кэш.
    У ОС может быть кэш.
    Браузер может использовать один из вариантов DNSSEC.
    Вариантов много.
    Ответ написан
  • Какие инструменты использовать для распознования круглых объектов на изображении?

    Vindicar
    @Vindicar
    RTFM!
    Думаю, можно попробовать преобразование Хафа (Hough transform). Оно может обнаруживать не только окружности.
    Либо можно попробовать применить пороговое преобразование (простое/адаптивное), а потом уже делать градиент и Хафа.
    Ответ написан
  • Как найти простые числа в диапазоне?

    Vindicar
    @Vindicar
    RTFM!
    Решето Эратосфена предполагает удаление элементов, кратных очередному простому числу.
    Т.е. обработали 2 - вычеркиваем каждый 2й элемент. Обработали 3 - каждый третий, и так далее.
    Отсюда получаем следующее.
    У нас есть исходный список элементов.
    numbers = list(range(2, n+1))
    На каждом шаге, когда мы проверяем число k, мы выкидываем все числа, кратные k, кроме самого k.
    numbers = [ x for x in numbers if x % k != 0 or x == k]

    А как мы выбираем k? Просто идём по списку чисел от начала. Все элементы в начале списка всегда будут простыми, так как 2 - простое, а все последующие составные элементы будут выкинуты на одной из итераций
    i = 0
    while i < len(numbers):
      k = numbers[i]
      numbers = [ x for x in numbers if x % k != 0 or x == k ]
      i += 1
    Ответ написан
    Комментировать
  • Как реализовать валидацию?

    Vindicar
    @Vindicar
    RTFM!
    Ну можно и через лямбды, но - имеет ли это смысл? В чем будет выигрыш по сравнению с простым try except?
    Будет менее читаемо, по-моему.

    К сожалению, суп не поддерживает из коробки XPath - эта штука позволяла бы задать селектор как в примере одной строкой вида
    //li[contains-token(@class, 'CardInfoRow_year')]//span[contains-token(@class, 'CardInfoRow__cell')][1]/a[contains-token(@class, 'link')]


    Можно наколхозить грубое подобие:
    class BSItem: # одиночный элемент
        def __init__(self, item):
            self._item = start
        
        def __bool__(self):
            return bool(self._item)
        
        def __str__(self):
            return self._item.contents[0] if self else ''
        
        @property
        def tag(self):
            return self._item
        
        def __truediv__(self, other): # оператор / ищет один элемент
            if not self: # пустой элемент так и останется пустым
                return self
            if isinstance(other, str): # item / 'tag.classname'
                tag, _, cls = other.partition('.')
                if cls:
                    return BSItem(self._item.find(tag, class_=cls))
                else:
                    return BSItem(self._item.find(tag))
            if isinstance(other, int) and other == 0: # item / 0 == item
                return self
            if callable(other): # item / lambda tag: tag.has_attr('id')
                return BSItem(self._item.find(other))
            raise ValueError() # передали ерунду
        
        def __floordiv__(self, other): # оператор // ищет все элементы
            if not self:
                return BSItems([])
            if isinstance(other, str): # item // 'tag.classname'
                tag, _, cls = other.partition('.')
                if cls:
                    return BSItems(self._item.find_all(tag, class_=cls))
                else:
                    return BSItems(self._item.find_all(tag))
            if callable(other): # item // lambda tag: tag.has_attr('id')
                return BSItems(self._item.find_all(other))
            raise ValueError()
    
    
    class BSItems: # коллекция элементов
        def __init__(self, items):
            self._items = items
        
        def __bool__(self):
            return bool(self._items)
        
        def __iter__(self): #позволяет делать for tag in BSItems:
            return iter(self._items)
        
        def __len__(self):
            return len(self._items)
        
        def __truediv__(self, other): # оператор / ищет один элемент в каждом элементе
            if not self: # пустой элемент так и останется пустым
                return self
            if isinstance(other, str): # item / 'tag.classname'
                tag, _, cls = other.partition('.')
                if cls:
                    return BSItems([item.find(tag, class_=cls) for item in self._items])
                else:
                    return BSItem([item.find(tag) for item in self._items])
            if isinstance(other, int): # items / 2 найдет третий элемент в коллекции
                return BSItem(self._items[other]) if len(self._items) > other else BSItem(None)
            if callable(other): # items / lambda tag: tag.has_attr('id')
                return BSItems([item.find(other) for item in self._items])
            raise ValueError() # передали ерунду
        
        def __floordiv__(self, other): # оператор // ищет все элементы
            if not self:
                return self
            if isinstance(other, str): # item // 'tag.classname'
                tag, _, cls = other.partition('.')
                result = []
                for item in self._items:
                    result.extend(item.find_all(tag, class_=cls) if cls else item.find_all(tag))
                return BSItems(result)
            if callable(other): # item // lambda tag: tag.has_attr('id')
                result = []
                for item in self._items:
                    result.extend(item.find_all(other))
                return BSItems(result)
            raise ValueError()


    За точность кода не ручаюсь, но идею должен передать.
    Пример использования будет примерно такой:
    year_tag = BSItem(soup) / 'li.CardInfoRow_year' // 'span.CardInfoRow__cell' / 1 / 'a.Link'
        year = str(year_tag) or '-'
    Ответ написан
  • Как изменить вывод длинного не целочисленного числа на питоне?

    Vindicar
    @Vindicar
    RTFM!
    Если знаешь, сколько знаков после запятой тебе надо - то print(f'{a:.12f}') где 12 - сколько знаков после запятой выводить.
    Ответ написан
    2 комментария
  • Почему моя функция всё время возвращает "False"?

    Vindicar
    @Vindicar
    RTFM!
    Метод .sort() списка сортирует список на месте, и возвращает None.
    Если нужна отсортированная копия списка без изменения оригинала, функция sorted() в помощь.
    А вообще, можно же ещё проще. Список сортируем по возрастанию? Тогда нужно убедиться что каждый следующий элемент больше предыдущего.
    def is_sorted(lst) -> bool:
      for i in range(0, len(lst)-1)
        if lst[i] > lst[i+1]: #нашли элементы в неправильном порядке
          return False #значит не отсортирован
      # если сюда дошли, то отсортирован
      return True

    Или то же самое но короче
    def is_sorted(lst) -> bool:
      return all( lst[i] <= lst[i+1] for i in range(0, len(lst)-1) )
    Ответ написан
    Комментировать
  • Как задать время мута, бана в команде?

    Vindicar
    @Vindicar
    RTFM!
    get_args() → Optional[str]
    Судя по документации, get_args() возвращает строку, идущую после команды, или None. Разбор этой строки - уже твоя забота. Например, так:
    1. присвоить результат .get_args() переменной и убедиться, что это не None.
    2. ободрать пробелы с помощью .strip()
    3. превратить в int()/ float() и поймать исключение, если в строке не число
    4. использовать полученное значение.
    Ответ написан
    2 комментария
  • Как лучше осуществить запись в файл python при асинхронной работе?

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

    Vindicar
    @Vindicar
    RTFM!
    Вообще PyCharm вроде умеет создавать виртуальные окружения (читай - локальные копии питона) для своих проектов? Тогда просто в каждом проекте создай свой venv, установи локально в него нужные пакеты и работай так.
    Но точнее сказать затрудняюсь, с PyCharm сам не работал.
    Ответ написан
    2 комментария
  • Как сделать вывод статуса бота discord?

    Vindicar
    @Vindicar
    RTFM!
    Обычно боты предоставляют событие для включения, типа on_ready.
    Для выключения это реально сделать только если ты выключаешь бота командой. Если просто завершить процесс бота, то бот скорее всего не успеет ничего сделать.

    Детали зависят от используемой библиотеки, которую ты не указал.
    Ответ написан
    2 комментария
  • Отмена цикла командой?

    Vindicar
    @Vindicar
    RTFM!
    Простого способа нет, так как каждое обращение к команде создаст новый выполняющийся экземпляр xpfarmm().
    Один способ - создать хранилище вида "id пользователя - логический признак". Например, словарь (dict). Каждому пользователю сопоставишь логическое значение. Если значения для id пользователя нет в словаре - пользователь не запустил команду. Если значение есть, и это True - команда выполняется. Если значение есть, и это False - команда должна быть остановлена.
    Тогда при запуске команды xpfarm:
    1. Убеждаешься, что id пользователя нет в словаре. Иначе отказ. (Пользователь ведь не может запустит ькоманду второй раз пока она работает?)
    2. Вносишь True в словарь для id пользователя.
    3. Входишь в цикл. На каждой итерации цикла проверяешь, не изменилось ли значение в словаре на False. Если изменилось, делаешь break.
    4. По выходу из цикла удаляешь значение из словаря.

    Убедись, что задержку в цикле делаешь через await asyncio.sleep(), иначе бот уснёт пока цикл не закончится, и не будет ни на что реагировать!

    А чтобы отменить, делаешь отдельную команду, которая ищет id пользователя в словаре. Если оно есть - заменяет его на False.
    Ответ написан
    Комментировать