Ответы пользователя по тегу Python
  • Как добавить новый элемент в список?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    У вас класс, в нем методы. Вы передаёте в методы класса экземпляр self. Класс нужен для того, чтобы его методами менять состояние атрибутов в экземпляре класса. А вы зачем-то используете методы класса как обычные функции, которые по-вашему должны что-то менять в каких-то глобальных переменных (типа ger53 в вашем коде).
    Это совершенная каша и неправильное использование классов.
    В самом примитивном случае правильное использование может выглядеть как-то так:
    class MyTestObj(object):
        def __init__(self):
            self.ger53 = []
        
        def test54(self, arg):
            self.ger53.append(arg)
        
        def __repr__(self):
            return str(self.ger53)
    
    my_instance = MyTestObj()
    print(my_instance) # обращение к экземпляру до изменения состояния
    my_instance.test54(42) # изменение состояния при помощи метода test54
    print(my_instance) # обращение к экземпляру после изменения состояния 
    print(my_instance.ger53[0]) # обращение к атрибутам экземпляра

    Есть и более изощренные способы, с геттерами/сеттерами, прочими изысками.

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

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    data = [9, 8, 7, 7, 6, 3, 1, -2, -3, -7, -7, -9]
    counter = 0
    while not data[counter] < 0:
        counter += 1
    print(data[counter], counter)

    или
    data = [9, 8, 7, 7, 6, 3, 1, -2, -3, -7, -7, -9]
    for counter, temperature in enumerate(data):
        if temperature < 0:
            print(temperature, counter)
            break

    но я не очень люблю break, это субъективно.

    Ну и кривенький однострочничек:
    data = [9, 8, 7, 7, 6, 3, 1, -2, -3, -7, -7, -9]
    print(*[(temperature, counter) for counter, temperature in enumerate(data) if temperature < 0][0])
    Ответ написан
    Комментировать
  • Как сократить данный код?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Тут много путей уменьшить код.
    Можно начать с того, что у вас многократно повторяется.
    К примеру,
    if message.text == '26.01':
            markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
            bt1 = types.KeyboardButton('8:00')
            bt2 = types.KeyboardButton('9:00')
            bt3 = types.KeyboardButton('10:00')
            bt4 = types.KeyboardButton('11:00')
            bt5 = types.KeyboardButton('12:00')
            bt6 = types.KeyboardButton('13:00')
            bt7 = types.KeyboardButton('14:00')
            bt8 = types.KeyboardButton('15:00')
            bt9 = types.KeyboardButton('16:00')
            bt10 = types.KeyboardButton('17:00')
            bt11 = types.KeyboardButton('18:00')
            bt12 = types.KeyboardButton('19:00')
            bt13 = types.KeyboardButton('20:00')
            bt14 = types.KeyboardButton('21:00')
            back11 = types.KeyboardButton('Назад')
            markup.add(bt1, bt2, bt3, bt4, bt5, bt6, bt7, bt8, bt9, bt10, bt11, bt12, bt13, bt14, back11)
            bot.send_message(message.chat.id, text='Выберите удобную вам дату для записи', reply_markup = markup)

    повторяется несколько раз. Значит, этот фрагмент можно записать один раз и затем многократно вызывать, подставляя только меняющиеся элементы.

    Но и внутри видно многократное повторение нумерованной переменной, это явный признак плохого кода.
    Эту проблему можно решить разными способами. В данном случае, когда значения идут равномерно (час за часом), можно их просто сгенерировать, рассчитать, и поместить в список.
    Например:
    first_hour = 8
    last_hour = first_hour + 14
    buttons = [f'{current}:00' for current in range(first_hour, last_hour)]
    print(buttons)
    print(buttons[0])

    И этот список и передавать в нужное место вместо bt1, bt2, bt3, bt4, bt5, …

    И не надо его всякий раз генерировать, один раз достаточно, потом в нужных случаях вызывать.

    Следует отметить, что вам пока рано заниматься ботами. Сделайте что-то попроще, калькулятор например, игру «быки-коровы»… я не шучу.
    Ответ написан
    Комментировать
  • Я преобразовал этот код из py в ехе, но теперь при запуске команды переменная n выводится не в файл, а в командную строк(cmd), что делать?

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

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Проблема в том, что в консоли шрифт моноширинный, а в телеграме - нет.
    Ответ написан
    2 комментария
  • RuntimeError: no running event loop, что делать?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Попробуйте поменять asyncio.create_task(Song.my_after(ctx)) на await asyncio.create_task(Song.my_after(ctx))
    Ответ написан
  • Можно ли вызвать функцию так, чтобы перед её выполнением выполнилась ещё одна функция класса?

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

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

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    как она должна выглядеть, чтобы сработал этот код?
    она должна выглядеть, как список или кортеж.
    Ответ написан
    Комментировать
  • Указать регистрируемый экземпляр Message apscheduler с помощью ContextSchedulerDecorator?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Указать регистрируемый экземпляр Message apscheduler с помощью ContextSchedulerDecorator?

    Указывайте, согласовано.
    Ответ написан
    Комментировать
  • Как два разных компа, подключенные к двум РАЗНЫМ WIFI, соединить с помощью python socket?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Коротко:
    Чисто кодом это как правило не решить.
    длинно
    Разные Wi-Fi в подавляющем большинстве случаев означает «разные подсети», т.к. большинство устройств , раздающих wi-fi, это маршрутизаторы (роутеры), и они создают каждый свою подсеть со своей адресацией.
    Для того, чтобы из подсети одного достучаться в подсеть другого, нужно эти самые роутеры правильно настроить. Без этого практически никакой код не поможет (ну, почти никакой, но исключения лучше не рассматривать).

    Как именно настроить роутеры - это отдельный вопрос, к python отношения не имеет. Вам надо почитать про сети, маршрутизаторы, подсети, их адресацию, порты, «проброс» портов и всё вот это вот.

    Кроме этого, еще надо решить вопрос с внешними адресами этих роутеров. Эти адреса могут быть тоже в разных подсетях, и лучше, чтобы они были «белыми» адресами, а также чтобы не находились за «файрволлом» и/или чтобы нужные вам порты на внешних адресах этих роутеров были доступны из интернет. Белые адреса - услуга платная, предоставляет провайдер.

    Иногда можно обойтись без «белых» адресов через dynamic DNS, но тут могут быть проблемы с доступностью портов. Белые адреса обычно решают проблему.
    Ответ написан
    4 комментария
  • Register_next_step_handler указываю 2 аргумент как функцию, но выдает ошибку что это переменная и она локальная пишу после elif?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Функция должна быть объявлена до использования. А у вас она объявлена после того, как вы ее пытаетесь передать как параметр другой функции.
    Более того, вы ее зачем-то объявляете в elif-ветке ветвления, что очень плохо. Пока условие этой ветки не сработает, этой функции вообще нет нигде. Очень сомнительное решение.
    Ответ написан
    6 комментариев
  • Почему так странно выделяется память под разные типы данных?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    c = (1, 2, 2+1)
    d = (1, 2, 2+1)
    print(id(c), id(d))


    А вообще-то не надо гадать. В книгах надо прочесть. Например, «Изучаем Python» М.Лутц
    Ответ написан
  • Как пофиксить ошибку?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Как пофиксить ошибку?

    Очень просто. Три простых шага:
    1. Открываем документацию
    2. Читаем название большими буквами:
    Building Linux System Appliances with KIWI Next Generation (KIWI NG) 9.24.56

    3. Понимаем, что это библиотека под Linux; предназначена для сборки образов LINUX; кроме того, догадываемся, что KIWI, QIWI и KIVY это три больших разницы.
    Ответ написан
    Комментировать
  • В Pycharm код выполняется, из винды нет, почему?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    В принципе можно запустить Python в интерактивном режиме и сделать импорт вашего скрипта. Пусть ваш скрипт называется my_script.py
    C:\>python
    >>> import my_script
    Имя:_
    ну и так далее. Для простого скрипта, вероятно, сойдет и так.

    Но есть нюанс:
    Если скрипт должен использовать установленные библиотеки, то в ide они ставились в виртуальное окружение. В консоли это виртуальное окружение надо активировать, чтобы указанная в окружении версия Python и библиотек стала доступна.
    Ответ написан
    Комментировать
  • Как запустить скрипт с ошибкой при нажатии на него?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Google борется с рассылками и спамом, а ваш код именно это и реализует. Даже не пытайтесь. Забанят вас накрепко, не выкарабкаетесь потом.
    Ответ написан
    Комментировать
  • Могу ли я создать несколько ics - календарей из одного json - файла?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Например, можно воспользоваться библиотекой py-ics
    Надо преобразовать JSON в структуру Python (список словарей, например), затем перебирать в списке словари, для каждого преобразовывать данные в требуемый библиотекой формат и затем сериализовать при помощи самой библиотеки.
    Как сериализовать и в какие форматы преобразовывать - есть в документации к библиотеке.
    Ответ написан
  • Как в Python присвоить объекту класс, если имена классов хранятся в списке?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Используйте для этого словарь, например.
    class One:
        name = 'Class One'
    
    class Two:
        name = 'Class Two'
    
    class Three:
        name = 'Class Three'
    
    
    if __name__ == '__main__':
        classes = {'One': One, 'Two': Two, 'Three': Three}
        class_names = ['One', 'Three', 'Two']
        my_entities = [classes[class_name] for class_name in class_names]
        
        for entity in my_entities:
            print(entity.name)
    Ответ написан
    Комментировать
  • Как верно вытащить список всех папок и файлов включенных в папки?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Я думаю, проблема была в csv writer-е, надо внимательно изучить, как он работает внутри. Мне лень его изучать, в данном случае проще собрать элементы списка через «перевод строки» в одну длинную строку и всё разом записать в файл.
    import os
    
    root_path = "testfolder"
    directory = []
    for root, dirs, files in os.walk(root_path):
        for name in files:
            directory.append(os.path.join(root, name))
    with open('DIR_Geo.csv', 'w', encoding='utf-8') as f:
        f.write('\n'.join(directory))

    Это костыль, но в данном случае, когда мы элементы списка формируем из os, и мы понимаем, что в них не попадут какие-нибудь специальные символы вроде переводов строки, табуляций и т.п., то ничего страшного произойти не должно.
    Ответ написан
    5 комментариев
  • Где ошибка в цикле?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Для получения уникальности можно вместо списка использовать множество (set). Там метод не append, а update. Ну или просто получить список с полным набором неуникальных значений и преобразовать в множество
    years_unique = []
    for i in data['Year']:
        years_unique.append(i)
    years_unique = set(years_unique)

    и далее по тексту.
    Ответ написан
    Комментировать
  • Как вызвать exception еще раз после его срабатывания?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Если не хотите while, оберните свой try/except в функцию и сделайте из ветки исключения рекурсивный вызов. Но я бы, возможно, выбрал while.
    Ответ написан
    2 комментария