Ответы пользователя по тегу Python
  • Проблема с кодом на Python ошибка после компиляции в Exe для windows 10?

    Vindicar
    @Vindicar
    RTFM!
    # определяем функцию, которая загружает расписание из файла
    def load_schedule():
        try:
            ...  # реальная ошибку у тебя где-то здесь!
        except FileNotFoundError:  # но при ошибке ты глотаешь исключение и молча возвращаешь None
            return None, None
    
    def check_schedule2():
        start_time, end_time = load_schedule()
        ...  # а тут не проверяем, вернула ли функция значение или None

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

    А еще да, сравнение строк производится лексикографически (посимвольно). Т.е. строка "2" будет больше чем "12". Конкретно в твоём случае это сработает, так как у тебя будет "02", а не "2" для двух часов, но так делать всё равно неправильно. Я бы рекомендовал почитать про класс datetime.datetime (модуль datetime), его экземпляры можно сравнивать напрямую.
    Ответ написан
    Комментировать
  • Почему не работает код?

    Vindicar
    @Vindicar
    RTFM!
    if time <= time_15:

    По логике должно быть if time > time_15:
    Ответ написан
    Комментировать
  • Как скачать видео с ВК с помощью пайтон?

    Vindicar
    @Vindicar
    RTFM!
    Посмотри в сторону youtube-dl. Она поддерживает не только YT, но и другие сайты, в том числе ВК. Плюс её можно использовать и как отдельную утилиту, и импортировать её в свой скрипт.
    Ответ написан
  • Как получить и форматировать цену с копейками на python?

    Vindicar
    @Vindicar
    RTFM!
    Ну можно сделать регулярку. Но вообще тебе правильно подсказывают: сделай валидацию ввода! Всё равно юзеров не перехитришь, с них станется прописью ввести.
    import re
    from decimal import Decimal  # не используй float для денег!
    
    sum_regexp = re.compile(r'^((?:\D*\d+)+?)(?:\D+(\d{2}))?\D*$')
    
    def string_to_sum(s: str) -> Decimal:
        match = sum_regexp.match(s)
        if match is None:
            raise ValueError(f'Not a correct sum: {s!r}')
        integer_part = re.sub(r'\D', '', match.group(1))
        fraction = match.group(2) or '00'
        fixed_string = f'{integer_part}.{fraction}'
        return Decimal(fixed_string)
    
    
    tests = {
        '0': Decimal('0.0'),
        '1000': Decimal('1000.0'),
        '10.00': Decimal('10.0'),
        '10,00': Decimal('10.0'),
        '1 000': Decimal('1000.0'),
        '1,000,000.00': Decimal('1_000_000.00'),
        '1000 рублей 90 копеек': Decimal('1000.90'),
    }
    
    for inp, res in tests.items():
        print(inp, end=': ')
        try:
            actual_res = string_to_sum(inp)
        except ValueError as err:
            print('Exception: ', err)
        else:
            if res != actual_res:
                print('Mismatch, got', actual_res)
            else:
                print('OK')
    Ответ написан
    Комментировать
  • Как получить id bios в python?

    Vindicar
    @Vindicar
    RTFM!
    Такого значения нет. Имей ввиду, что:
    - любая привязка к железу обламывает тех, кто сделает апгрейд
    - многие железные идентификаторы поддаются изменению
    - программу на питоне тривиально отредактировать, чтобы оторвать нафиг эту проверку

    Если тебе нужна защита от копирования, посмотри в сторону pyarmor. Но имей ввиду, pyarmor тоже отрывается при желании.
    Ответ написан
  • Как отобразить работу скрипта Python запущенного через systemctl?

    Vindicar
    @Vindicar
    RTFM!
    ОП, ты хочешь странного. Осознай, что демоны (а systemd управляет как раз программами типа daemon) по определению не предназначены для взаимодействия непосредственно с пользователем, в частности через терминал. А значит, у тебя два выхода:

    1. Перестать хотеть странного, и реализовать нормальные логи и анализировать их. Тогда можно будет в любой момент посмотреть историю, выведенную в лог.
    При необходимости отслеживать файл лога в реальном времени можно использовать команду tail -f файл.log. Почитай про неё.
    Также можно натравить на лог какую-нибудь утилиту мониторинга, которая будет его читать и посылать тебе оповещения о событиях по другому каналу.
    Если лог большой, есть logrotate.
    Минус - специфические терминальные фишки в логе работать не будут. Скажем, прогрессбар там не сделаешь, и ввести текст не получится.

    2. Отказаться от запуска программы как классического демона, и запускать её через утилиту screen. Тогда ты сможешь сконнектиться к сессии screen когда угодно.
    Плюс - взаимодействие с терминалом как обычно. В том числе из разных ssh сессий.
    Минус - screen не самая удобная штука, сочетания клавиш там мозголомные. Плюс всё равно запуск screen придётся заворачивать в systemd если тебе нужен автозапуск и автоперезапуск.
    Ответ написан
    4 комментария
  • Почему не работает код?

    Vindicar
    @Vindicar
    RTFM!
    В твоём коде показано, как определить класс объекта. Смотри, как формируется prediction_text.
    А дальше просто. Храни в глобальной переменной время, когда был сохранён последний снимок объекта с желаемым классом.
    Если у тебя на текущем кадре есть объект с желаемым классом, проверь текущее время. Если прошло 30 секунд с последнего сохранения - сохрани новый снимок, и обнови время последнего сохранения на текущее.
    Ответ написан
    Комментировать
  • Как решить проблему?

    Vindicar
    @Vindicar
    RTFM!
    Входной файл, который ты грузишь вызовом users = json.load(f) записан не в кодировке utf-8. или переделай его, чтобы был в utf-8, или выясни его кодировку и укажи её при открытии файла.
    Ответ написан
  • Пишу код для счастливых билетов, но в коде что-то не то и циклы не работают после 000000, в чём проблема?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, у тебя уехали циклы, начиная с о второй цифры. Они не внутри общего цикла.
    Далее, ты можешь заменить 6 циклов на один, просто по числам от 0 до 999999.
    for number in range(0, 1_000_000):
        str_number = f'{number:0>6}' # превращаем число в строку, добивая нулями слева до 6 знаков
        digits = list(map(int, str_number))  # каждый символ строки превращаем в отдельное число, т.е. цифру
        d1, d2, d3, d4, d5, d6 = digits  # распаковываем список цифр в отдельные переменные


    Ещё ты можешь перебирать первые 5 цифр, а шестую цифру вычислять - сумма первых трёх минус четвёртая и минус пятая . Если результат в диапазоне 0-9, то это и будет шестая цифра.

    Если же ты предпочтёшь перебирать 5 цифр отдельными циклами, то стоит делать иначе.
    Первые 3 цифры перебираешь полным циклом, 4я цифра не должна превышать сумму первых 3х, 5я цифра не должна превышать сумму первых 3х - 4ю цифру. 6ю цифру вычислишь.
    for d1 in range(10):
        for d2 in range(10):
            for d3 in range(10):
                for d4 in range(min(9, d1+d2+d3) + 1):
                    for d5 in range(min(9, d1 + d2 + d3 - d4) + 1):
                        d6 = d1 + d2 + d3 - d4 - d5
                        if 0 <= d6 <= 9:
                            print(f'{d1}{d2}{d3}{d4}{d5}{d6}')


    Аналогично, можно заметить, что не всегда имеет смысл перебирать 4-5 цифры с нуля. Пример: если первые три цифры 299, то четвёртая не может быть 0 или 1 - в этом случае оставшиеся две цифры должны будут дать в сумме 20 или 19, что невозможно. С учётом код изменится так:
    for d1 in range(10):
        for d2 in range(10):
            for d3 in range(10):
                min_d4 = max(0, d1 + d2 + d3 - 18)
                max_d4 = min(9, d1 + d2 + d3)
                for d4 in range(min_d4, max_d4 + 1):
                    min_d5 = max(0, d1 + d2 + d3 - d4 - 9)
                    max_d5 = min(9, d1 + d2 + d3 - d4)
                    for d5 in range(min_d5, max_d5 + 1):
                        d6 = d1 + d2 + d3 - d4 - d5
                        if 0 <= d6 <= 9:
                            print(f'{d1}{d2}{d3}{d4}{d5}{d6}')
    Ответ написан
    Комментировать
  • Почему код не работает так как должен?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала, разность двух datetime даёт объект timedelta.
    И в доках написано так:
    Only days, seconds and microseconds are stored internally. Arguments are converted to those units:
    A millisecond is converted to 1000 microseconds.
    A minute is converted to 60 seconds.
    An hour is converted to 3600 seconds.
    A week is converted to 7 days.

    Т.е. timedelta(days=1).seconds даст 0, так как это 1 день и 0 секунд.

    Выхода два.
    1. Построй объект timedelta, описывающий таймаут операции, и сравнивай с ним напрямую.
    timeout = datettime.timedelta(days=1)
    if (datetime.datetime.now() - last_command_use_time) > timeout:
        ...

    2. Используй метод total_seconds()
    timeout = datettime.timedelta(days=1)
    if (datetime.datetime.now() - last_command_use_time).total_seconds() > 24*60*60:
        ...
    Ответ написан
    Комментировать
  • Почему с отрицательным кол-во хп персонаж жив?

    Vindicar
    @Vindicar
    RTFM!
    1. Включи логику. Ты сначала проверяешь, умер ли персонаж, а потом наносишь урон. Отсюда и наблюдаемое поведение.
    2. Никогда не используй f-строки для SQL запросов, освой parametrized queries.
    Ответ написан
    Комментировать
  • Почему не работает meber_join disnake?

    Vindicar
    @Vindicar
    RTFM!
    Разберись уже, как работает utils.get().
    Она принимает коллекцию объектов, и набор атрибутов в виде kwargs.
    Возвращает первый объект в этой коллекции, у которого атрибуты совпадают с заданными.
    Т.е. тебе надо туда передать список ролей сервера и атрибут id.
    Ну или использовать другой метод, например, member.guild.get_role().

    Читай документацию, короче.
    Ответ написан
    Комментировать
  • Как сделать список в операторе?

    Vindicar
    @Vindicar
    RTFM!
    Либо как это сделал soremix , либо вот так, однострочником:
    if any(word in text for word in list_hello):
        print('Oi!')

    Но и тут много подводных камней. "превед" такой подход не опознает, а вот на "нехай" сработает.
    Ответ написан
    Комментировать
  • Почему тип dict не изолируется внутри класса?

    Vindicar
    @Vindicar
    RTFM!
    class Interface:
        a = 1
        b = dict()
        c = []

    Ты описал класс с тремя атрибутами класса. Не экземпляра, а именно класса.
    Три атрибута экземпляра описываются как
    class Interface:
        def __init__(self):
            self.a = 1
            self.b = dict()
            self.c = []

    А если тебе нужен эквивалент интерфейсов, почитай про typing.Protocol.
    Ответ написан
    Комментировать
  • Sqlite - как добавить текст в ячейку бд, если в нем могут содержаться и одинарные, и двойные кавычки?

    Vindicar
    @Vindicar
    RTFM!
    А всего-то нужно прочитать документацию. Там этот случай описан, и показано, как делать правильно.
    con = sqlite3.connect(":memory:")
    cur = con.execute("CREATE TABLE lang(name, first_appeared)")
    
    # This is the named style used with executemany():
    data = (
        {"name": "C", "year": 1972},
        {"name": "Fortran", "year": 1957},
        {"name": "Python", "year": 1991},
        {"name": "Go", "year": 2009},
    )
    cur.executemany("INSERT INTO lang VALUES(:name, :year)", data)
    
    # This is the qmark style used in a SELECT query:
    params = (1972,)
    cur.execute("SELECT * FROM lang WHERE first_appeared = ?", params)
    print(cur.fetchall())
    Ответ написан
    5 комментариев
  • Некорректная работа sqlite. Работа с параметрами. Что мне делать?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, проверить структуру таблицы eBase, какие столбцы там есть.
    Во-вторых, никогда не использовать форматирование строк для составление запросов.
    Для этой цели есть parametrized queries.
    Ответ написан
    5 комментариев
  • Как обработать ошибку UnicodeDecodeError и при этом продолжить чтение файла?

    Vindicar
    @Vindicar
    RTFM!
    Альтернативное решение - использовать не обёртку for ... in file, а использовать цикл while и вызывать file.readline() вручную.
    Ответ написан
    Комментировать
  • Как посмотреть тело функции в python?

    Vindicar
    @Vindicar
    RTFM!
    Для встроенных функций не получится. Они не на Питоне реализованы. Читай исходники, как посоветовал Влад Григорьев .
    Ответ написан
    Комментировать
  • Почему выходит None?

    Vindicar
    @Vindicar
    RTFM!
    else print(item + "-NO")
         ^^^^^
    Ответ написан
    Комментировать
  • Как работает переприсваивании значений переменных Phyton?

    Vindicar
    @Vindicar
    RTFM!
    Мы ведь уже присвоили в предыдущем блоке if, что l1 = a.

    А может, и не присвоили. Не факт, что предыдущий if выполнился. Тогда останется l1 от предыдущей итерации цикла. А на первой итерации - будет начальное значение l1 = 0.
    Ответ написан
    Комментировать