Ответы пользователя по тегу Python
  • Почему дублируются логи при использовании библиотеки logging?

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

    Да, похоже вы не правильно поняли суть хендлеров.
    Фильтруют сообщения логгеры, хендлеры их обрабатывают.
    В вашем случае достаточно было одного хендлера. Несколько нужны на случай, если бы вам помимо stdout некоторые логи нужно было бы отправлять по почте, некоторые особенным образом форматировать и пихать в отдельный файл (например важные ошибки), некоторые гасить и никуда не выводить, некоторые отправлять через телеграм-бота в чат.

    LOGGING_CONFIG = {
        'version': 1,
        'disable_existing_loggers': True,
        'formatters': {
            'standard': {
                'format': '[%(asctime)s] %(levelname)s | %(name)s: %(message)s',
                'datefmt': '%Y-%m-%d %H:%M:%S',
            },
        },
        'handlers': {
            'std': {
                # 'level': 'INFO',
                'formatter': 'standard',
                'class': 'logging.StreamHandler',
                'stream': 'ext://sys.stdout',
            },
        },
        'loggers': {
            'init': {
                'level': 'DEBUG',
                'handlers': ['std'],
                'propagate': 1,
            },
            'parse': {
                'level': 'DEBUG',
                'handlers': ['std'],
                'propagate': 1,
            },
            'getmail': {
                'level': 'DEBUG',
                'handlers': ['std'],
                'propagate': 1,
            },
        },
    }
    Ответ написан
    3 комментария
  • Как часть имени файла записать в тот же файл?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы можете вытащить дату из имени файла: fname[3:].rsplit('.', 1)[0]
    И добавить эту строку в начало каждой при записи.
    Осторожнее, ваш метод равнения интервалов будет работать корректно только в случае такого формата даты в имени файла, у которого сначала идет год потом месяц, потом день, а месяц и день выравнены нулями до двух знаков.
    Ответ написан
    Комментировать
  • Какие есть ошибки в коде?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В одном месте скобки поставил, а востальных таких же местах? Смотри внимательно.
    А ещё у тебя дискриминант в нижнем регистре употреблен в формулах, а присвоен в верхнем. В питоне это две разные переменные, он различает большие и малые буквы.
    Ещё имеет смысл приводить входные параметры не к int а к float, мало ли, коэффициенты захочется дробными задать. Универсальнее выйдет, хотя если по условию задачи это целые числа, то подкопаться к этому не получится.
    Ответ написан
    2 комментария
  • Как сделать перенос строки?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Я делаю так, если уж приспичит, но нужно стараться делать выражения проще и читабельнее:
    print(*[
        str(int(i) ** 2) 
        for i in input().split(' ') 
        if int(i) % 2 == 1 and str(int(i) ** 2)[-1] != '9'
    ])

    Для сложных кусков правил несколько:
    - не экономьте строки.
    - открытые скобки (любые) намекнут питону, что оператор еще не закончился.
    - ни к чему лишний раз ставить символ переноса строки, это может привести к ошибкам.
    - не экономь на спичках: если кусок алгоритмически сложен, не нужно экономить на промежуточных переменных, это позволит сделать код понятнее. Если уж хочется освободить память пораньше, то можно удалять переменные, но всё должно быть целесообразно.
    - если уж нагородил литералов сборки спика или словаря, отформатируй их понятно.
    Ответ написан
    Комментировать
  • Как создать окно команд в python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А что именно у вас вызывает вопросы?
    Вы реализовываете функцию, которая принимает текущий контекст, строку команды, и поток для вывода выхлопа.
    Если нужно REPL в терминале, то в цикле функцией input запрашиваете команду, передаёте её в выше упомянутую функцию.
    Можно сделать не функцию, а класс, тогда он может ъанить в себе контекст текущего состояния вашей командной оболочки и поток для вывода, а функция обработки команды может быть не одна, а много методов, помеченных префиксами или декораторами. так для каждой команды можно свой метод описать, а декораторами можно указывать права доступа к соответствующей команде, какую-то еще специфику.
    Если нужны команды с аргументами, ключами, параметрами, с автодокументацией, то можно воспользоваться встроенными библиотеками парсинга командной строки, например optparse, или сторонней развесистой библиотекой, например, click.

    Если командная стрроука нужна не в терминале, а, скажем, в браузере, то интерфейс обработки тот же, но в цикле приёма команд вы можете брать их не из stdin, а из веб-сокета или API на flask. Можно создать окно с помощью Tkinter или PySide\PyQt и запрашивать текст команд там. Можно поискать библиотеки реализации расширенных термиальных воможностей, где будет автодополнение, подсказки и прочее.

    В целом, судя по вашему вопросу, вам стоит либо остановиться на простейшем REPL в терминале как я написал в начале, либо подучиться немного питону в частности и программированию в целом и тогда этот вопрос у вас уже не встанет, поскольку окажется тривиальным.

    Успехов.
    Кстати, я не искал, возможно (и даже наверняка) есть готовые продвинутые библиотеки для реализации кастомных REPL питоне. Наверно кто-то подкинет такие варианты в альтернативных ответах.
    Ответ написан
    Комментировать
  • Python+Mysql возникает ошибка?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Смотрите внимательнее:
    """inser into log
        (phrase, letters, ip, browser_string, results)
        values
        ('hitch-hiker', 'aeiou', '127.0.0.1', 'Firfox', "{'e', 'i'})"""

    Используются тройные кавычки. СПрячем их для ясности:
    inser into log
        (phrase, letters, ip, browser_string, results)
        values
        ('hitch-hiker', 'aeiou', '127.0.0.1', 'Firfox', "{'e', 'i'})

    что видим? у вас непарная двойная кавычка перед фигурной скобкой.
    Именно об этом вам "намекал" парсер SQL выдавая исключение и указывая на конкртеное место проблемы. Внимательно смотрите и увидите.
    Ответ написан
    Комментировать
  • Как получить неуникальные элементы списка после преобразования его set()'ом?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    from collections import Counter
    [k for k, v in Counter(items).items() if v > 1]
    Ответ написан
    3 комментария
  • Как реализовать "таймер неактивности функции" после использования функции?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Из вашего вопроса не ясно многопользовательский у вас планируется бот или однопользовательский. То есть будут ли одним инстансом бота пользоваться больше одного человека?
    Также не понятно в случае нескольких пользователей, у каждого своё ограничение раз в час, или на всех одно сообщение в час.
    В любом случае ваш бот должен хранить некоторую информацию - это называется хранить состояние.
    Вам нужно звранить дату последнего сообщения для каждого пользователя или для всех, в зависимости от постановки задачи. В общем случае для этого лучше всего использовать какую-то БД вроде монги или sqlite. В случае SQLite ничего ставить не нужно, всё. что требуется, уже есть в комплекте с питоном.
    Я бы рекомендовал сделать при запуске создать в ней, если еще не создана, таблицу с идентификатором пользователя и датой последнего сообщения. В последствии можно будет реализовать оба варианта функциональности.

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    модуль subprocess позволяет выполнять консольные команды и получать их выхлоп (в том числе в реальном времени).
    Ответ написан
    2 комментария
  • AttributeError: 'int' object has no attribute 'replace' как исправить?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    У целого числа нет метода replace.
    Чушь написана в коде.
    Ответ написан
    4 комментария
  • Что делает этот код из воркера на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    list(map(Queue, ['default']))
    # Эквивалентно
    [Queue('default')]

    Разницы в данном случае нет.
    Ответ написан
    Комментировать
  • Как импортировать определённые строки в Python?

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Начнем с того, что порты не закрыты, если речь не идёт о брандмауэре.
    Нет такого понятия, как "открыть порты" при установлении TCP-соединения. Сервер "слушает" порт (ожидает подключения). Клиент инициирует подклчение на арес и конкретный порт сервера. При этом сокеты так устрены, что существуюет и исходящий порт на клиенте. Если нет брандмаура, то вам никто незппретит через любой незанятый порт произвести подключение на удаленный.
    Открывать порты из питона не нужно.
    Ответ написан
    1 комментарий
  • Почему send_keys в Selenium работает через раз?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Если спрашиваете совета как решить проблему, приводите воспроизводимые примеры.
    Мало того. что код не проверяете на опечатки, так еще и проблема у вас какая-то локальная. Может быть комп тормозит, может быть страница в браузере, может быть js на ней тупо рандомные нажатия клавиш пропускает.
    С учетом невоспроизводимости вашей проблемы, разумно было бы хотя бы попробовать дугие драйверы, хром тот же... А-то складывается впечатление, что "ой что-то не работает памагити!!!111"
    Ответ написан
    Комментировать
  • Поможете с задачкой на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Нет, вы можете получить листинг каталога по маске glob.glob('*.user'), потом взять максимальное (в алфавитно-цифровом порядке) имя, отрезать у него расширение, превратить в целое число, увеличить на единицу, отформатировать нулями слева и создать новый файл.

    last = max(glob.glob('*.user')+[''])
    new = (last and int(last.split('.')[0]) or 0) + 1
    Ответ написан
    Комментировать
  • Почему не работает super, чтобы взять метод из второго родителя?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Первым аргуменом super нужно передавать класс C, а в третьем питоне вообще ничего не нужно передавать.
    Вызовите нужный метод нужного предка явно, если вам так уж нужно:
    class C(A, B):
        def hi(self):
            B.hi(self)

    Но если вам это нужно, значит вы где-то ошиблись в архитектуре, в дизайне классов и методов. Вы явно не ак поняли принципы ООП.
    Расскажите подробно для чего вам такое нужно, и вам здесь наверняка подскажут как сделать правильно.
    Ответ написан
  • Как решить эту задачу(ЕГЭ информатика 2021)?

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

    Есть такая классическая задача "упаковка рюкзака". Там даны неделимые предметы и их массы. У рюкзака есть максимально допустимая масса. Все предметы в рюкзак не влезут, но нужно нужно пдобрать такой набор, чтобы нагрузить рбюкзак максимально. Эта задача вычислительно сложная при большом числе предметов. Она решается полным перебором.

    Ваша же задача гораздо проще. Вам нужно положить в такой рюкзак как можно больше предметов из имеющихся, чтобы не превысить максмальную массу (в вашем слуае объём бэкап-диска).
    Вот у вас есть большой набор разных гирек, и нужно максимальное число гирек разместить на чаше весов, чтобы не превысить какой-то вес. Как вы будете выбирать гирьки?

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

    Давайте я вам ещё рефакторинг вашего кода сделаю. Это не сделает его правильным, но он станет лучше.
    with open("zadanie26_var_1.txt") as f:  # Так открытый файл будет закрыт после считывания
        # Так вы считаете первые два числа в отдельные переменные:
        total_volume, users_count = map(int, f.readline().strip().split())
        # А так считаете остальные строки в список и нечаянные пустые строки вас не смутят:
        user_sizes = [int(line.strip()) for line in f if line]  
    
    # Хорошо бы вынести логику решения в отдельную функцию:
    def solve(s, n, lst):
        # Вот так можно сделать проверки корректности (ну чисто для себя) входных данных:
        assert s <= 10000, 'Invalid total volume'
        assert len(lst) == n, 'Users count is not valid.'
        assert n <= 2000, 'Wrong users count.'
        assert all(0 < x <= 100 for x in lst), 'Invalid user size.'
    
        # Вот здесь вот вы сделаете нужные вычисления ;)
        backup_users_count = ...
        max_backup_file_size = ...
    
        return backup_users_count, max_backup_file_size
    
    # Ну а вызвать функцию и напечатать ее результат вы тоже сумеете, правда?
    Ответ написан
    4 комментария
  • Как обработать список?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Используйте collections.deque параметром maxlen как очередь с вытеснением.
    При если файла нет в списке, доавляйте его, а лишний будет вытеснен.
    Ответ написан
    Комментировать
  • Как посчитать пройденную дистанцию с помощью map()?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ваш код можно сделать чуточку яснее вот так:
    def distance_traveled(self) -> float:
        return Movement(*self._movements[0]).distance + Movement(*self._movements[1]).distance

    А то, что вы хотите можно можно сделать так:
    return sum(Movement(*step).distance for step in self._movements)
    Ответ написан
    1 комментарий
  • Как использовать тип переменной key в питоне?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Комментировать