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

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    if sent.dice.value == 1 or 2:
    означает если (значение равно 1) или истина:
    то-есть всегда истинно.
    Внимательнее изучите, как правильно такие вещи делать.
    Можно
    if 1 <= value < 6:
    Можно
    if value in range(1, 6):
    Можно
    if value in [1, 2, 3, 4, 5]:
    Ответ написан
    3 комментария
  • Почему не работает replace в python, json?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    f"<@{akitaino>"
    отсутствует закрывающая фигурная скобка.
    Ответ написан
  • Не работает in для json.load в python?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    alakamve2022, посмотри вот
    это
    import json
    
    inp = input("input")
    with open(f"info.json", 'r') as f:
        prefix = json.load(f)
        result = None
        for key in prefix:
            if prefix[key] == inp:
                result = key
        if result is not None:
            print(f'Yes, {result}')
        else:
            print(f'{inp} not found')


    Это не идеальный пример, но хотя бы так. Оно найдет последний попавшийся ключ в JSON, значение которого соответствует inp. Если их там несколько, остальные не покажет. Если не найдет, сообщит.
    Ответ написан
    Комментировать
  • Как сделать лог выполнения кода? И сохранять в текстовом файле?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Я тут по приколу заморочился:
    Заморочка
    import datetime
    import itertools
    
    
    class MyTimer:
        def __init__(self, first_time_in_datetime, delta=10, target_time_in_datetime=None):
    
            self.current = self.repair_first_time_type(_first_time=first_time_in_datetime)
            self.target_time_in_datetime = self.repair_target_time_type(_target_time=target_time_in_datetime)
            self.delta_in_minutes = delta
            self.zero = self.target_time_in_datetime < self.current
    
        def repair_first_time_type(self, _first_time):
            return self._repair_time_type(_first_time)
    
        def repair_target_time_type(self, _target_time):
            if _target_time is not None:
                return self._repair_time_type(time_data=_target_time)
            else:
                return datetime.time(23, 59)
    
        @staticmethod
        def _repair_time_type(time_data):
            result = datetime.time(20)
            if isinstance(time_data, datetime.time):
                result = time_data
            if isinstance(time_data, str) and ':' in time_data:
                try:
                    _hour, _minute, *_ = time_data.split(':')
                    result = datetime.time(int(_hour), int(_minute))
                except TypeError:
                    print('Need ISO format time. Time set to 20:00:00')
                except ValueError:
                    print('only numbers and :. Time set to 20:00:00')
            return result
    
        def _add_time(self, tm=None):
            if tm is None:
                tm = self.current
            fulldate = datetime.datetime(100, 1, 1, tm.hour, tm.minute, tm.second)
            fulldate = fulldate + datetime.timedelta(minutes=self.delta_in_minutes)
            return fulldate.time()
    
        def add_time(self):
            self.current = self._add_time()
            self.zero = self.zero and self.current > self.target_time_in_datetime
    
        @property
        def next(self):
            return self._add_time()
    
        @property
        def check(self):
            if not self.zero:
                return self.current >= self.target_time_in_datetime
            else:
                return self.current < self.target_time_in_datetime
    
        def __repr__(self):
            return self.current.isoformat(timespec='minutes')
    
    
    def write_file_from_data(data, filename):
        with open(filename, 'wt') as target_file:
            target_file.write('\n'.join(data))
    
    
    def make_names():
        return [input(f'введите {i}:') for i in 'abcv']
    
    
    def make_data(_counter):
        result_data = []
        while not _counter.check:
            time_from, time_to = _counter, _counter.next.isoformat(timespec='minutes')
            result_string = f'{time_from}-{time_to} @{next(names)}'
            result_data.append(result_string)
            _counter.add_time()
        return result_data
    
    
    if __name__ == '__main__':
        names = make_names()
        # names = ['aaa', 'bbb', 'ccc', 'ddd']
        names = itertools.cycle(names)
    
        result_filename = 'result.txt'
    
        first_time = '20:00'
        target_time = '00:00'
        delta_in_minutes = 10
        counter = MyTimer(first_time, delta_in_minutes, target_time)
    
        write_file_from_data(data=make_data(counter), filename=result_filename)

    но это так... больные фантазии на тему... много лишнего, не уверен что все граничные варианты охватил, в общем накарябал.
    Ответ написан
    3 комментария
  • Как избавиться от ошибки в linux mint при обновлении пакета python3.10 minimal subset?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Правило номер 0:
    Никогда не перезаписывать системный Python ни в какой системе, кроме как посредством системных обновлений.
    Правило номер 1:
    Используйте отдельные виртуальные окружения для каждого нового проекта, устанавливайте туда нужные версии ПО, включая python.
    Ответ написан
    Комментировать
  • Как мне доставать данные из списка?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    data = [('10', '11', '48', '56', '34')]
    [print(i) for i in data[0]]
    Ответ написан
  • Как получить количество строк в документе, если строка одна?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Можно как-то так:
    filename = 'groups.txt'
    with open(filename, 'r') as file:
        for n, line in enumerate(file, 1):
            line = line.rstrip('\n')
            print(f'{n}\t{line}')

    Это легко гуглится, кстати.
    Ответ написан
    Комментировать
  • У меня ошибка 'Database' object has no attribute 'connection', как это решить?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    def __int__
    ->
    def __init__
    сам порой на эту граблю наступаю с автоподстановкой.
    Ответ написан
    Комментировать
  • Как обратиться к объекту класса renpy, если я не знаю его имя?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Во-первых, не объекты, а экземпляры класса. Объект класса это немного другое.
    Во-вторых, то, что у вас написано, не валидный код Python.
    У вас нет там никакого создания экземпляров класса.
    Экземпляры можно класть в список, например. И потом обращаться к экземплярам в списке по индексу (в квадратных скобках).
    Вот так это может выглядеть:
    class MyClass:
        def __init__(self, i):
            self.i = i
        
        def img(self):
            return self.i + 1
        
        def pos(self):
            return self.i * 2
        
        
    circles = [1, 2, 3]
    result = []
    
    for i in circles:
        result.append(MyClass(i))
    
    print(result[0].img())
    print(result[2].pos())
    Ответ написан
  • Как убрать скобки?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Попробуйте bot.send_message(message.chat.id, '@' + bd[0])
    Ответ написан
    4 комментария
  • Как при отсутствии интернета, перезапустить код(телеграмPyTelegramBot)?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    while True:
        try:
            start_my_bot()
        except НазваниеОшибки as e:
            print(e)
            try:
                stop_my_bot()
            except:
                pass
            time.sleep(10)
    Ответ написан
    2 комментария
  • Как сделать перебор по порядку в позиции строки из списка символов на Python?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Если решать «в лоб», то как-то так:
    def change(position, new_character):
        return  string[:position] + new_character + string[position+1:]
    
    string = 'example'
    new_characters = 'abcdef'
    for n, _ in enumerate(string):
        for new_character in new_characters:
            print(change(n, new_character))
    Ответ написан
    3 комментария
  • Вывод случайного значения из бд?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Вывод случайного значения из бд?

    Нет. См.п.3.6
    Ответ написан
    1 комментарий
  • Как вывести данные из бд через строки?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Предположим, что часть про SQLite у вас работает как надо и всегда возвращает в row корректный tuple.
    Код предполагает, что длина row всегда равна длине ROW_HEADS, это лучше проверять, иначе могут быть ошибки и сбои.

    Формально решить задачу можно как-то так, например:
    ROW_HEADS = ["ID:", "Имя:", "Почта:", "Добавлен:", "Зарплата:"]
    
    
    def make_string(row):
        return '\n'.join([f'{key} {value}' for key, value in zip(ROW_HEADS, row)])
    
    
    if __name__ == '__main__':
        row = (1, 2, 3, 4, 5)
        print(make_string(row))
    Ответ написан
    Комментировать
  • Почему не работает переменная которая прошла через функцию?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Потому что переменная не "прошла через функцию".
    Одна переменная value2 ссылается на другую переменную, объявленную в global, а другую value2вы объявляете в своем методе путем явного присвоения:
    value2 = real_name
    До объявления value2 ссылалось на объект из global, но после объявления внутри метода стало ссылаться на другой объект, и стало отдельным от глобального.
    Пример, поясняющий id объектов
    class Demo:
        def __init__(self):
            pass
    
        def check(self, value1, not_real, value2, real):
            print(f'\t{value2} тут еще не объявили {id(value2)}, ссылается на глобальную')
            if value1 == not_real:
                value2 = real
                print(f'\t{value2} тут уже объявили {id(value2)}, ссылается на real {id(real)}')
    
    
    my_var = 2
    print(f'{my_var} тут глобальная {id(my_var)}')
    my_test = Demo()
    my_test.check(1, 1, my_var, 3)
    print(f'{my_var} тут глобальная {id(my_var)}')

    У вас есть два относительно простых выхода:
    возвращать значение из метода через return
    костыль, т.к. получается, что это не метод, а просто функция
    class Demo:
        def __init__(self):
            pass
    
        def check(self, value1, not_real, real):
            if value1 == not_real:
                return real
    
    
    my_var = 2
    print(my_var)
    my_test = Demo()
    my_var = my_test.check(1, 1, 3)
    print(my_var)



    передавать в функцию список и менять элемент списка
    чудовищный костыль, так лучше не делать, т.к. класс меняет что-то вне класса, да еще изменение списка какое-то неявное, можно забыть или не уследить
    class Demo:
        def __init__(self):
            pass
    
        def check(self, value1, not_real, value2, real):
            if value1 == not_real:
                value2[0] = real
    
    
    my_var = [2]
    print(my_var[0])
    my_test = Demo()
    my_test.check(1, 1, my_var, 3)
    print(my_var[0])


    По-идее, класс должен содержать в себе экземпляры и методы для изменения этих экземпляров, а снаружи ничего менять ему не надо. Если меняет - плохо, не тем занимается. В принципе, бывают случаи, когда делают классы - "швейцарские ножи", складывая в них всякие функции, относящиеся к одной теме... но это как-то мне кажется не этот случай.
    Ответ написан
    1 комментарий
  • Можно ли как-то получит данные об изменениях в Google Sheets с помощью python?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Вижу два варианта:
    1. Хранить последние состояния каждой ячейки в отдельной колонке и сверять с текущим; произошло изменение - фиксируем новое состояние как текущее и отправляем его клиенту
    2. В таблице хранить отдельно колонку флага «updated», если True - значит обновилось, отдаём данные клиенту, ставим флаг False. Мониторим флаги 300 тыс раз в наносекунду.
    Ответ написан
    2 комментария
  • Как правильно построить логику приложения?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Первое, что приходит в голову: если уж классы, то и трэки - класс. Со всеми вытекающими. Но это отдельная история.

    Второе - для списков добавление элемента - метод .append()
    Можно и «плюсовать», но лучше явно, чем неявно.
    Т.е. self.data['tracks'].append({…})
    Но тут мы подходим к третьему: если у тебя класс проигрывателя, зачем внутри него делать вот этот словарь self.data?
    Пусть у класса проигрывателей будут атрибуты «self.tracks: list» и «self.queueloop_status: bool».
    Т.е.
    self.tracks.append({…})
    self.queueloop_status = True

    И, наверное, для управления всем этим классу проигрывателя надо оформить соответствующие методы (add, remove, сеттеры/геттеры и т.д.),
    Ответ написан
    Комментировать
  • Почему rpy не читает скрипт?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Ошибка именно в синтаксисе и именно от незнания синтаксиса Python.
    Дело в том, что скобки в Python - не просто скобки. Это литералы. Круглые скобки - это литерал последовательности tuple, т.е. кортежа. Кортеж непременно должен содержать разделитель - запятую.
    У вас my_tuple = (rf"first element") - это невалидная запись.
    Должно быть так:
    my_tuple = (rf"first element", )
    Или так:
    my_string = rf"first element" если вы хотите получить просто строку.

    Но, поскольку вы хотели в действительности получить путь к вашей папке, я бы использовал библиотеку pathlib и сделал бы как-то так:
    from pathlib import Path
    
    def get_folders(source_path: Path):
        return [item for item in source_path.iterdir() if item.is_dir()]
        
    def get_files(source_path: Path):
        return [item for item in source_path.iterdir() if item.is_file()]
    
    
    my_home = Path.home()
    my_path = 'Library/Application Support/Steam/steamapps/workshop/content/331470/508932099/escs/'
    
    blpi_path = my_home / my_path
    
    print(f'folders:\n{get_folders(blpi_path)}\n')
    print(f'files:\n{get_files(blpi_path)}\n')
    Ответ написан
  • Какую проверку сделать на member вк, что бы не выходило ошибок?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    В общем случае вам надо прочесть api, по которому работает ваш код, понять, какой тип ожидается, и сделать проверку на этот тип через isinstance.

    Есть альтернативный вариант - сделать через try/except, но тут надо прочесть раздел api, в котором описаны exceptions, выбрать правильный и применить.

    Приносите свою попытку решения, если что не сработает.
    Ответ написан
  • Добавляю в sqlite3 через python в таблицу данные и выдает ошибку почему?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Элементарно, Ватсон!
    В области видимости переменных функции passw переменная loginDb - не определена, поэтому функция ищет такую переменную в вышележащей области видимости - в глобальной. А там эта переменная определена и ссылается на класс str (кстати, зачем???)
    В то же время в области видимости переменных функции auth переменная loginDb определена, поэтому она там не имеет никакого отношения ни к одноименной переменной в глобальной области, ни к одноименной переменной в функции passw.
    На вход execute попадает значение str - а это - класс, а не строка, поэтому execute и ругается, что тип не подходящий.

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