Ответы пользователя по тегу Python
  • Как сделать цикл не задерживающий программу в Python?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала, что значит "не задерживал"? Если последующий код зависит от результата работы этого цикла, толку всё равно не будет.
    Так что первым делом определись для себя, какие куски кода ты хочешь выполнять параллельно и почему. Вынеси эти фрагменты в отдельные функции.
    Далее, реализовать более-менее параллельное выполнение можно через threading.Thread, но там есть целый ряд подводных камней. В первую очередь, доступ на запись (или на чтение и запись) к одной и той же переменной из двух потоков. Во вторую, как следствие - умение передать исходные данные в другой поток и дождаться результата работы из другого потока. В третью - объекты из некоторых библиотек нормально работают только в пределах одного потока, передавать их между потоками нельзя.
    Ответ написан
    Комментировать
  • Python — Невозможно создать экземпляр абстрактного класса ... с помощью абстрактных методов?

    Vindicar
    @Vindicar
    RTFM!
    Отступы косые, будь внимательнее.
    У тебя check() объявлена как локальная функция внутри __init__(), соответственно в самом классе такого метода нет. А так как метод объявлен абстрактным в BoundFilter и не переопределён в твоём классе, то и твой класс остаётся абстрактным. А потому попытка создать его экземпляр проваливается.
    Ответ написан
    Комментировать
  • Как сделать сообщение с фоном в дискорд?

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

    Vindicar
    @Vindicar
    RTFM!
    Что значит "запускался с определённой директории"?
    Использовал эту диеркторию в качестве рабочей при запуске? os.chdir()
    Ответ написан
    Комментировать
  • Как распарсить первый 'слой' строки 'struct'?

    Vindicar
    @Vindicar
    RTFM!
    Вообще очень проблематично будет такое распарсить, в том числе регулярками, так как все возможные разделители (в т.ч. "<", запятая, ">") встречаются не по одному разу на разных уровнях. Это задача того же плана, что и "проверить, является ли последовательность скобок корректной (все скобки закрыты, нет закрывающей скобки до открывающей)". Такое решается с помощью конечных автоматов со стеком.
    Код навскидку не приведу - не совсем тривиальная вещь.

    EDIT: вот тебе разбивка на слова, может, поможет.
    def tokenize(line: str):
        token = []
        for ch in line:
            if ch.isalnum() or ch == '_':
                token.append(ch)
            else:
                if token:
                    yield ''.join(token)
                    token.clear()
                yield ch
        if token:
            yield ''.join(token)
    
    data = 'struct<Milk:array<struct<id:string,type:string>>,Oil:string,batter:array<struct<id:string,type:string>>>'
    tokens = list(tokenize(data))
    print(tokens)


    EDIT2: вроде получилось. Спёр идею из одного генератора парсеров - состояние (т.е. конструкция, которую мы обрабатываем) описывается методом класса, стек - стеком вызовов питона, переход из состояния в состояние - вызовом/возвратом из метода.
    Структура данных не совсем та, которая тебе нужна - но её будет куда проще обойти.
    Простыня
    import typing as t
    import enum
    
    
    class Parser:
        @staticmethod
        def tokenize(line: str) -> t.Iterable[str]:
            token = []
            for ch in line:
                if ch.isalnum() or ch == '_':
                    token.append(ch)
                else:
                    if token:
                        yield ''.join(token)
                        token.clear()
                    yield ch
            if token:
                yield ''.join(token)
        
        def process(self, line: str):
            tokens = list(self.tokenize(line))
            result = self.do_type(tokens)
            if tokens:
                raise ValueError('Extra tokens at the end of the line: {0!r}'.format(''.join(tokens)))
            return result
        
        def _consume(self, tokens: t.List[str], expected: t.Optional[str] = None):
            token = tokens.pop(0)
            if expected is not None and token != expected:
                raise ValueError(f'Expected {expected!r}, got {token!r}')
            return token
        
        def do_type(self, tokens: t.List[str]) -> t.Union[str, t.Dict]:
            if tokens[0] == 'struct':
                return self.do_struct(tokens)
            elif tokens[0] == 'array':
                return self.do_array(tokens)
            else:
                return self._consume(tokens)
        
        def do_struct(self, tokens: t.List[str]) -> t.Dict:
            self._consume(tokens, 'struct')
            self._consume(tokens, '<')
            result = {}
            while True:
                name, value = self.do_struct_part(tokens)
                result[name] = value
                if tokens[0] == ',':
                    self._consume(tokens, ',')
                else:
                    break
            self._consume(tokens, '>')
            return result
        
        def do_struct_part(self, tokens: t.List[str]) -> t.Tuple[str, t.Union[str, t.Dict]]:
            name = self._consume(tokens)
            self._consume(tokens, ':')
            value = self.do_type(tokens)
            return name, value
        
        def do_array(self, tokens: t.List[str]) -> t.Dict:
            self._consume(tokens, 'array')
            self._consume(tokens, '<')
            result = { None: self.do_type(tokens) }
            self._consume(tokens, '>')
            return result
    
    
    data = 'struct<Milk:array<struct<id:string,type:string>>,Oil:string,batter:array<struct<id:string,type:string>>>'
    p = Parser()
    print(p.process(data))
    Ответ написан
    Комментировать
  • Как посчитать количество директорий в папке на python?

    Vindicar
    @Vindicar
    RTFM!
    Найти всё, потом для каждого пункта проверить, папка это или нет.
    Либо с помощью pathlib это всё можно реализовать (см. методы в Path), либо с помощью glob.glob() и os.path.isdir().
    Ответ написан
    Комментировать
  • Как данные из большого списка поместить в словарь?

    Vindicar
    @Vindicar
    RTFM!
    1. Делаешь строке .split() по символу перевода строки (\n).
    2. Каждой строке делаешь .partition() по символу ":", получаешь три значения: слева, двоеточие, справа
    3. В словаре используешь значение слева как ключ, значение справа как значение.

    P.S.: Код не проси, тут не невесть как сложно.
    Ответ написан
    1 комментарий
  • Что не так с производительностью pygame и этим кодом?

    Vindicar
    @Vindicar
    RTFM!
    Замерь время выполнения отдельных участков кода через time.perf_counter(), узнай на чем оно задумывается.
    По мне так наиболее вероятные кандидаты - pygame.event.get() и screen.fill().
    Ответ написан
    7 комментариев
  • Проблема с оптимизацией сортировки методом Bubble sort. Как ускорить сортировку для списка из 100 тысяч элементов?

    Vindicar
    @Vindicar
    RTFM!
    start = time.perf_counter()
    bubble_sort(spisok)
    end = time.perf_counter()

    Неужели в голову не пришло, что нужно замерять время как можно ближе к интересующему участку кода?
    Ответ написан
    2 комментария
  • Как сохранить key и value в словаре(dictionary) после завершения работы кода?

    Vindicar
    @Vindicar
    RTFM!
    Сохранить словарь целиком в файл, при запуске программы загрузить из этого файла.
    Если в словаре только примитивы (строки, числа), а также словари и списки, то можно использовать модуль json для этой цели.
    Ответ написан
  • Как pycharm запускает файлы?

    Vindicar
    @Vindicar
    RTFM!
    __init__.py в корель folder1. Вписывать в него что-либо нужно только если тебе нужно, чтобы работали импорты вида
    import folder1
    и
    from folder1 import whatever
    Ответ написан
    3 комментария
  • Возможно ли уменьшить данный код?

    Vindicar
    @Vindicar
    RTFM!
    if callback.data in ('test1', 'test2', 'test3'):
        for ret in cur.execute("SELECT id, title, score FROM names WHERE name = ?", (callback.data, )):
            await bot.send_video(callback.from_user.id, ret[0], caption=f'Текст под постом1: {ret[1]}\n Текст под постом2: {ret[-1]}\n\n Текст под постом3 \n\nТекст под постом4, reply_markup=underpost_butt)
    Ответ написан
    Комментировать
  • Можно ли сделать выдачу роли на время Discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Можно.
    Храни в БД id роли, id учатсника и время, когда нужно будет снять роль. Раз в минуту ищи записи, для которых назначенное время меньше текущего времени, снимай роли с этих юзеров и удаляй записи.
    Ответ написан
  • Как сделать чтобы бот discord.py получил число сообщений в канале?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, можно, но не стоит.
    Дискорд не заморачивается ведением такой статистики, или не делает её доступной.
    Т.е. тебе придётся загружать и считать ВСЕ сообщения в канале, что вызовет дикую нагрузку на бота.
    Да и улететь за лимиты обращений к апи можно легко.

    Во-вторых, зачем?
    Я вот затрудняюсь придумать пример, когда эта информация необходима.
    Ответ написан
  • TypeError: 'NoneType' object is not iterable, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Включить голову и прочитать уже документацию по fetchone().
    Fetches the next row of a query result set, returning a single sequence, or None when no more data is available.

    В get_signup() не находит такое значение в базе, в выдаче 0 строк, так что fetchone() возвращает None, который ты ничтоже сумнящеся скармливаешь циклу for.
    И вообще у тебя фигня творится с методом get_signup().
    С чего ты взял, что он вернёт строку "setnickname"?
    Зачем ты делаешь for row in result если result - это результат вызова fetchone(), т.е. либо строка, либо None?
    Почему при получении сообщения не предусмотрено что пользователя может тупо не быть в базе? Например, он не писал /start, а сразу написал сообщение, или базу потерли, или ещё что.
    Ответ написан
  • Почему не работает функция time.sleep() в цикле?

    Vindicar
    @Vindicar
    RTFM!
    Дело не в sleep(), дело в том, что os.system() останавливает вызвавший поток, пока запущенный процесс не завершится.
    У тебя скрипт вешается на
    os.system('D:/Steam/steamapps/common/GarrysMod/hl2.exe')
    Ответ написан
    Комментировать
  • Перестала работать команда Def в Python, как решить проблему?

    Vindicar
    @Vindicar
    RTFM!
    def создаёт именованную функцию, которую потом можно вызывать по имени. Её тело не будет выполнено, пока функция не будет вызвана фактически. В твоём случае вызов будет происходить так: eidos()
    Однако следует заметить, что твоя функция опирается при работе на значения в глобальных переменных brand, number, arrivaldate. Если их не изменять между вызовами, eidos() всегда будет давать один и тот же результат.
    Собственно, если приведённый код - это весь скрипт, то функция тебе вообще без надобности, можно оставить всё одним скриптом.
    А вот если есть ещё что-то, что ты не показываешь, то ситуация может измениться.
    Ответ написан
    Комментировать
  • JSON неправильно записывает полученные данные. Как решить проблему?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, \u-нотация встречается не только в питоне, но и в JSON как таковом. Достаточно вбить в терминал питона
    print("\u0417\u0430\u043c\u0448\u0435\u0432\u0456 \u043c\u044e\u043b\u0456")
    чтобы убедиться, что строка в норме. Машина её прочитает без проблем.
    Но если таки хочется человекочитаемого вида (пусть и ценой усложения программы), то нужно почитать про параметр ensure_ascii, а заодно не забыть открыть целевой файл в кодировке utf-8 или подобной.
    Ответ написан
    Комментировать
  • Python 3 kivy. Как сохранить состояние программы?

    Vindicar
    @Vindicar
    RTFM!
    Посмотри на вопрос с другой стороны.
    Состояние виджетов наверняка определяется чем-то другим - состоянием приложения, которое описывается в терминах той предметной области, с которой ты имеешь дело.
    Опиши состояние приложения как класс, научись сохранять/загружать его без привязки к GUI.
    Потом научись создавать GUI на основании экземпляра этого класса.
    А потом меняй экземпляр этого класса при операциях с GUI.
    Почитай про паттерн Model-View-Intent, он примерно про это.
    Ответ написан
    1 комментарий