Задать вопрос
  • Как исправить эту ошибку? IndentationError: unindent does not match any outer indentation level?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Отступы в 3 и 4 строках разные, должны быть одинаковы. Почитай любой учебник по python для начинающих, там популярно объясняют, почему отступы в python так важны.
    Ответ написан
    Комментировать
  • Что написать в except ,чтоб программа не вылетала при неправильном вводе?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Программа в случае ошибки не просто упадёт, а выкинет исключение. Его надо будет поймать и обработать.

    Например:

    try:
      int("1")
      int("-1")
      int("+1")
      int("hello")
    except ValueError as e:
      print (f"ValueError occured: {e}")


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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Подобный вопрос: Прерывание рекурсии python 3?

    Однако это плохой способ, говорящий о плохой архитектуре программы. Исключения лучше использовать для ловли исключительных ситуаций, а подобные задачи решать иначе. Например, возвращать из функций результат или хотя бы признак успешного выполнения, который проверять на всех уровнях и передавать выше. А лучше подумать над тем, чтобы программа была по-другому устроена, в зависимости от задачи.
    Ответ написан
    2 комментария
  • Сallback_data. Python. Ошибка TypeError: send_message() got an unexpected keyword argument 'callback_data'?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    callback_data - свойство inline-кнопки, а не сообщения. Поэтому работать это и не может.

    keyboard = types.InlineKeyboardMarkup()
    keyboard.add(types.InlineKeyboardButton(text="Кнопка 1", callback_data="button1"))
    keyboard.add(types.InlineKeyboardButton(text="Кнопка 2", callback_data="button2"))
    bot.send_message(message.chat.id, "Нажми на кнопку - получишь результат", reply_markup=keyboard)
    
    @bot.callback_query_handler(func=lambda call: True)
    def button_callback(call):
      bot.send_message(call.message.chat.id, f"Ваша кнопка {call.data}")
    Ответ написан
    Комментировать
  • Почему не получается отправить сообщение пользователю?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В ошибке же всё написано - text должен быть строкой. Скорее всего, courses[course] - не строка.
    Ответ написан
    Комментировать
  • Как переслать сообщение от бота другому пользователю aiogram?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    call.message - это сообщение, с которого пришёл callback, разумеется, оно и есть "предыдущее". Нужно отправить новое сообщение с помощью send_message, этот метод вернёт это отправленное сообщение, дальше именно его и надо пересылать.
    Ответ написан
    Комментировать
  • Просмотр забытого пароля в Winscp?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Предлагаю попробовать echo "%*"
    Ответ написан
  • Не видно InlineKeyboardMarkup. Что я сделал не правильно?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если сначала отправлять сообщение, а только потом цеплять к нему клавиатуру, то клавиатура не будет отправлена.

    Вот тут:

    // внутри мы вызваем execute, который отправляет сообщение
    SendMessage sms = sendMsg(update.getMessage(), per);
    // к уже отправленному объекту сообщения мы цепляем клавиатуру
    sms.setReplyMarkup(getinlineKeyboardMarkup());
    // дальше с переменной sms мы ничего не делаем
    Ответ написан
    Комментировать
  • Как обработать исключение в потоке?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Как-нибудь так:

    web_urls = [...]
    attempts = 5
    for url in web_urls:
      for attempt in range(0,attempts):
        r = None
        try:
           r = requests.get(url)
        except requests.exceptions.ConnectionError, requests.exceptions.ReadTimeout:
           if attempt < attempts-1:
             sleep(5)
           else:
             print (f"Oops request failed and no more attempts for {url}")
        if r:
          break


    Не надо ловить except без конкретизации ошибки и даже без вывода её. В крайнем случае надо её словить и показать, чтобы хоть было известно, что она происходила:

    try:
      ...
    except Exception as e:
      print (e) # а ещё лучше использовать модуль traceback
    Ответ написан
    Комментировать
  • Что хранится на файле gshadow и зачем редактировать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    man gshadow всё объясняет.
    Ответ написан
  • Как правильно изменить?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    trending.text - это текст. Думаю, имелось в виду trending.json()
    Ответ написан
  • Как взять данные с двух таблиц?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Условие id=id2=ctx.author.id в зависимости от используемой базы может иметь как непредсказуемый эффект, так и вообще возвращать ошибку, потому что id=id2 возвращает булевое значение (true или false), которое затем сравнивается с ctx.author.id, что явно не планировалось. Вместо этого надо сделать два условия: id=id2 AND id=ctx.author.id. А ещё лучше переместить id=id2 в условие JOIN (таблица1 JOIN таблица2 ON условие)

    Далее, при работе с базой лучше использовать строки с плейсхолдерами, к этому следует приучать себя заранее, чтобы избегать рисков SQL-инъекций:

    cursor.execute("SELECT * FROM cars WHERE user_id=?", (current_user_id,))


    (В зависимости от базы данных плейсхолдер может быть не ?, как в sqlite3, а %s или что-то ещё)

    Далее, следует разумно выбирать имена полей в таблицах, чтобы их назначение было более понятным, а то что это за id и id2? Например:

    users:
    - id: id пользователя
    - name: имя пользователя
    - birth_date: дата рождения

    cars:
    - id: id автомобиля
    - owner_id: id пользователя-владельца (из таблицы users)
    - reg_number: гос. регистрационный номер
    - model: модель автомобиля

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

    cursor.execute("SELECT users.id AS user_id, users.name, cars.id AS car_id, cars.model FROM users JOIN cars ON users.id=cars.owner_id WHERE users.id=?", (ctx.author.id,))


    Запись (ctx.author.id,) с запятой в скобках нужна для того, чтобы вместо одного значения в функцию был передан tuple из одного значения. В python (1,2,3) означет tuple из трёх значений, но с одним значением такой синтаксис не прокатывает, (1) даёт то же, что и просто 1 без скобок, чтобы это обойти, надо поставить запятую (1,)
    Ответ написан
    Комментировать
  • Django & PostgreSQL MemoryError + не правильная работа скрипта?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Как тут уже правильно заметили, не надо ловить все Exception без разбору и даже не выводить никакой ошибки. Ничего хорошего от этого антипаттерна не получится.

    Как минимум следует начать хотя бы с такого:

    try:
      ...
    except Exception as e:
      print (e)


    Сейчас же, возможно, случается Exception, но мы этого даже не знаем.

    Далее, не стоит использовать ORM вперемешку с обычными запросами. Это тоже источник потенциальных проблем, ведь ORM может кэшировать данные, в том числе ещё не сохранённые. Возможно, до вызова save случился Exception, данные в кэше отличаются от данных в базе, но при прямом запросе в базу мы получим не то же самое, что получили бы из кэша.

    Вот такие мелочи могут создавать проблемы, которые при этом вообще нигде даже не отражается. И это ещё повезло, что эффект такой заметный. А если бы эффект проявлялся в одном случае из тысячи? Как бы его потом ловить и что отвечать пользователям, с которых списали лишних денег?
    Ответ написан
    Комментировать
  • У меня есть for который создает json файлы как сделать так что бы они создавались в нужной папке?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    TARGET_DIR = "path/to/directory"
    
    for i in range(0, dlinaspiska):
      filename = os.path.join(TARGET_DIR, akki[i]+".json")
      with open(filename, "w") as outfile:
        json.dump(...)
    Ответ написан
    Комментировать
  • Как в python telebot добавить кнопку?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это inline-клавиатура (привязанная к конкретному сообщению), чтобы получить обычную (не привязанную к конкретному сообщению), надо использовать ReplyKeyboardMarkup вместо InlineKeyboardMarkup.
    Ответ написан
    Комментировать
  • Бот Телеграмм на php. Проблема с удалением сообщений. Как правильно?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нужно боту в настройках группы явно выдать права на удаление сообщений.
    Ответ написан
    Комментировать
  • Какой есть сервис электронной почты с возможностью sms уведомлений о новых письмах?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Цена на A2P (application-to-person) SMS-сообщения в России сейчас порядка 2 рублей за 1 сегмент (67 символов Unicode UCS2) в зависимости от оператора. Поэтому бесплатных SMS-уведомлений сейчас не бывает.

    Рекомендую поставить почтовый клиент на телефон, который будет через PUSH-уведомления информировать о новых письмах бесплатно.
    Ответ написан
    Комментировать
  • Как сделать мультисессию в telethon?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Примерно так:

    client1 = TelegramClient(...)
    client2 = TelegramClient(...)
    
    client1.start()
    client2.start()
    
    async def main():
      ... my code ...
    
    if __name__ == '__main__':
      loop.run_until_complete(main())
      loop.close()
    Ответ написан
    Комментировать
  • Как брать результат в скобках в строке?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если скобки в тексте только вокруг этого числа и не встречаются больше нигде (боюсь, у некоторых клубов они могут оказаться в названии, что усложняет задачу), то

    m = re.match('\((.+?)\)', ...)
    value = float(m.group(1))
    Ответ написан
    Комментировать
  • Не отображается слайдер с фотками через Instant View?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Надо сделать шаблон для Instant View, который правильно сверстает эти фото. Ведь генерация Instant View не использует JavaScript. Соответственно, нужно понять, как достать реальные адреса картинок.

    Например, на одном сайте картинки грузились лениво с помощью JavaScript с указанием реальных картинок в атрибуте data-src, а в src была указана картинка-заглушка. Я сделал для этого сайта шаблон с таким правилом:

    # fix lazy load images
    @set_attr(src, ./@data-src): //img[has-class("image-lazy")]


    В результате вместо заглушек в Instant View показываются реальные картинки.
    Ответ написан
    3 комментария