• Как обрабатывать ошибки в асинхронном коде?

    Vindicar
    @Vindicar
    RTFM!
    try: 
        loop.create_task(exc())
    except ZeroDivisionError as ex:
        print(f"Ошибка {ex} обработана")

    1. Ты создаёшь задачу на базе корутины exc(). Созданная задача не выполнится немедленно, а только встанет в очередь исполнения (хотя в питоне 3.12 это поведение можно изменить, но по умолчанию это так). При этом с корутиной ассоциируется future-объект, который находится в состоянии "ожидание", так как корутина ещё не завершила работу.
    2. Ты проверяешь, не возникло ли исключение в процессе создания задачи. Это может произойти, только если exc() - не корутина. В остальных случаях операция будет успешна независимо от содержания exc(), так как см. пункт 1.
    3. Ты вызываешь loop.run_forever(). Рабочий цикл (loop) смотрит в очередь исполнения, и видит в нём только корутину exc(). Она получает управление.
    4. Корутина exc() выбрасывает исключение, но не ловит его. Ассоциированный с корутиной future-объект переходит из состояния "ожидание" в состояние "отказ", и сохраняет информацию об исключении. exc() завершает работу.
    5. Рабочий цикл проверяет, кто хранит ссылку на task - и понимает, что никто. Как следствие, даже в будущем никто не сможет узнать, что корутина выкинула исключение. Поскольку рабочий цикл - штука типовая, он понятия не имеет, что делала наша корутина и как надо реагировать на исключение в ней. А потому единственный вариант для него - написать в журнал работы о непойманном исключении и надеяться, что программист это увидит и поправит.
    task = asyncio.create_task(exc())
    try:
        # await asyncio.gather(task)  # <- gather() не нужно, если у тебя одна задача
        await task
    except ZeroDivisionError as ex:
        print(f"Ошибка {ex} обработана")

    1. Ты создаёшь задачу (успешно), а потом с помощью await-вызова просишь дождаться её завершения и получить результат.
    2. Корутина main() приостанавливает своё выполнение и сохраняет свой контекст, а также встаёт в очередь, ожидая, когда сработает future-объект, связанный с task.
    3. Рабочий цикл (loop) asyncio смотрит в очередь выполнения и видит, что корутина exc() готова выполняться (она не находится в await вызове, а только начала работу).
    4. Корутина exc() получает управление, выполняется, и генерирует исключение, которое не поймано внутри этой корутины. Future-объект, связанный с этой корутиной, переходит из состояния "ожидание" в состояние "отказ", и сохраняет информацию об исключении. Корутина exc() завершает выполнение. При этом о её future-объекте знает корутина main(), поэтому рабочий цикл не дёргается по этому поводу - у main() будет возможность отреагировать на происходящее.
    5. Рабочий цикл (loop) смотрит в очередь выполнения и видит, что там только корутина main(), причём она готова выполняться - future-объект, который она ждёт, более не находится в состоянии ожидания.
    6. Корутина main() получает управление и восстанавливает свой контекст, продолжая с того места, где она остановилась. Так как future-объект находится в состоянии "отказ", оператор await читает из него информацию об исключении и перевыбрасывает это исключение внутри main().
    7. Это исключение обрабатывается блоком try-except в main() как обычно.
    Ответ написан
    Комментировать
  • Какие способы бэкапа вы используете? Прошу несколько примеров с вашей работы или способов?

    888AndeR888
    @888AndeR888
    IT специалист
    Veem Backup and Replication Community Edition - бесплатна на 10 машин...
    Скрипт ghettoVCB - для ESXi.
    Также мой взор пал на UrBackup, но в бою не использовал, по обзорам классная...
    Ответ написан
    Комментировать
  • Какие способы бэкапа вы используете? Прошу несколько примеров с вашей работы или способов?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Ну, у нас используется Nakivo Backup & Replication. Сейчас его не купить, да и саппорт там просрочен, но работать он работает - бэкапит виртуалки, а также bare-metal винду и линуха.
    Древние системы как правило нужно сбэкапить один раз - туда никто обычно не вносит изменений. Для этого обычно она останавливается, винт вынимается и на нормальной машине делается его тупой посекторный образ через dd, котоый потом жмется bzip2. Потом при желании такой образ можно сконвертить в виртуальный диск для VBox например, для ESXi...
    Я таким образом например бэкапил FreeBSD, поставленную мной же, но... в 2006 году :) (А нужна она - не поверите - запускать эмулятор Netware, который в свою очередь нужен для запуска набора тестового софта, написанного в начале нулевых, исходники ессно утеряны, софт работает под DOS).
    Ответ написан
    Комментировать
  • Почему не работает pip install?

    @Everything_is_bad
    потому что pip внешняя утилита, не нужно ее запускать внутри среды выполнения
    Ответ написан
    3 комментария
  • Как обойти ошибку сервера Telegram при использовании метода answer_photo?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Чтобы отредактировать сообщение с фото нужно использовать edit_media, а не edit_text
    Ответ написан
    8 комментариев
  • Почему некоторые программисты на GO работают с бд на голом SQL без ORM?

    vabka
    @vabka
    Токсичный шарпист
    Не гошник, но расскажу в целом.
    1. На 1 уровень абстракции меньше. При работе с ORM нужно думать одновременно и об особенностях твоей ORM-ки и об особенностях базы.
    2. На сыром SQL некоторые вещи сделать проще, чем с ORM-ками.
    3. Лучше сырой SQL, чем тупая ORM-ка.
    4. Некоторые ORM-ки могут негативно влиять на производительность.

    Если тебе приходится при работе с ORM писать куски SQL-я (например для WHERE), передавать названия колонок в параметрах, и при этом ты не можешь использовать специфику твоей базы не опускаясь до уровня сырого SQL, то это плохая ORM.

    Нормальная орм-ка должна упрощать код и при этом не увеличивать пространство для ошибок.
    На сколько я знаю, Go не позволяет хорошую ORM-ку создать чисто из-за своего синтаксиса и системы типов.

    Нормальные ормки я пока видел только:
    1. В C# из-за Linq
    2. В Rust из-за макросов.
    Ответ написан
    8 комментариев
  • Как составить SQL запрос для подставления значения по времени?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    1) У вас во всех таблицах нарушен принцип уникальности записи. Айди, который должен однозначно идентифицировать запись, у вас означает что угодно кроме уникального айди.
    2) Так как ваш лог не привязан к сущности сообщения через соответствующее отношение, то выборка будет показывать что угодно, кроме того что вам нужно.

    Вывод: идите учите 1, 2 и 3 нормальные формы для начала. Потом нормально создайте таблицы. Потом скорее всего все вопросы сами отпадут, но если нет - вернетесь с нормальным вопросом.
    Ответ написан
    2 комментария
  • Как отправлять почту Python без использования сторонних SMTP?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    Без посредника скорее всего не получится.
    Ибо smtp теперь совсем непрост. Он с кучей криптографии, записями dns, подтверждениями и прочей херотой. Мало того, многие почтовики на первое письмо выдают ошибку, подращумевая, что не спамер булет посылать письмо повторно, а спамер - нет.
    Проще завести свой почтовый сервер для своего домена, и через него отправлять почту
    Ответ написан
    2 комментария
  • Как отправлять почту Python без использования сторонних SMTP?

    saboteur_kiev
    @saboteur_kiev Куратор тега Python
    software engineer
    Таким образом можно отправлять письма только на свой корпоративный почтовый сервер.
    Любой публичный почтовый сервер получателей сейчас использует дефолтные почтовые фильтры, которые сразу отвергнут ваше письмо. Разве что на сервере получателя договариваться о настройке исключения.

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

    Поэтому следует уточнить задачу - если вы отправляете письмо сами себе для мониторинга, то библиотек полно. Протокол smtp очень простой, хоть напрямую телнетом шли. Главное чтобы ваше письмо там не зарежектили.
    Ответ написан
    1 комментарий
  • В чем проблема плагинов "раскрашивания" скобок для IDE?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    Слишком много разноцветных побрекушек только отвлекают.
    А если тебе нужно раскрашивать скобочки, чтобы понимать где ты находишься, то их раскрашивание это только маскирование симптомов - проблема уже в архитектуре кода
    Ответ написан
    4 комментария
  • Pandas умеет чертить границы ячеек в Excel?

    Viktor_T2
    @Viktor_T2
    python developer
    # както так
    df.style.set_properties(**{'border': '1.3px solid red', 'color': 'green'}).to_excel('File.xlsx')
    Ответ написан
    1 комментарий
  • Кому отдать предпочтение iMac или Windows PC?

    @Drno
    У тебя не в железе проблема, в а прокладке между рулём и сиденьем.
    Поставь нормальную винду, поднастрой её немного.
    настрой железо
    всё будет летать.
    я хз как у тебя это может лагать, разве что там дикие перегревы или кривой биос

    Хотелось бы видеть замеры температуры для начала, при нагрузке и стресс тесте. например от OCCT или аида64
    Ответ написан
    6 комментариев
  • Почему флешка просит форматирование, как восстановить данные на ней?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    Сначала стоит сделать полную копию всего диска, байт-в-байт.
    Потому что утилиты типа chkdsk вполне могут вообще потерять всю ценную информацию!

    Второй момент, chkdsk не предназначена для восстановления информации, она ремонтирует ошибки файловой системы, приводит её в рабочее состояние. Именно на восстанавление заточены программы типа R-Studio.

    P.S. Стоит ещё почистить от окислов контакты самой USB флешки, и USB разъёма куда она вставляется. Можно извернуться и сделать это канцелярским ластиком (стирательной резинкой) погрубее...
    Ответ написан
    1 комментарий
  • Контейнеризация на Android?

    Sanes
    @Sanes
    Нет
    Ответ написан
    Комментировать
  • Пишу Todolist появилась ошибка, как исправить?

    @Sefroon Автор вопроса
    Может кому пригодится, я просто взял и в параметры Todo(), frame=, передавал не self.frame, а сразу self, то есть само окно и оно вполне нормально работало.
    Ответ написан
    1 комментарий
  • Как создать offline карту на python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Судя по постановке вопроса и ошибкам в его тексте вам ещё не скоро хватит знаний и опыта для реализации задуманного.
    Нет смысла отвечать подробно на него. Но в общих чертах сделать такой оффлайн навигатор несложно.
    Правда писать его с нуля на чистом питоне тоже никакого смысла нет. Обычно поднимают в докер-контейнерах готовые:
    - постгрес с постгисом
    - osrm
    - тайл-сервар
    - ну и само приложение, которое может быть как бэкенд веб-приложения или написано на том же ткинтере.

    Самое сложное во всём этом - это сконфигурировать все эти сервисы, ну или найти простую инструкцию которая доходчиво расскажет как вытащить необходимые данные из OSM, как настроить рендер тайлов, как сконфигурировать osrm...
    Ответ написан
    Комментировать
  • IndentationError: unexpected indent, но все инденты вроде в норме?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Невооружённым глазом видно, что отступы не в норме.
    Ответ написан
  • Как исправить ошибку "AttributeError: 'set' object has no attribute 'items'" в дискорд-боте?

    fenrir1121
    @fenrir1121
    Начни с документации
    Почитайте этот пример, запустите его и посмотрите на результат
    s = {'123'}
    d = {'token': '123'}
    print(type(s))
    print(type(d))


    Вы явно хотите использовать словарь, но создали вместо этого множество о чем вам написано в ошибке.
    Ответ написан
    Комментировать
  • Что почитать про парсинг?

    BadCats
    @BadCats
    К ответу datka - как к реальному и чисто прикладному - добавлю, что еще можно углубиться в теория формальных языков, грамматики (как работают компилятор, интерпретаторы) - что, возможно, позволит писать более универсальный код - не так сильно привязанный к верстке страницы - т.к можно пытаться анализировать html/xml - на уровне токенов и лексем, даже с кастомными классами и атрибутами для элементов. Но это очень сложная область и возможно, что "овчинка выделки не стоит".
    Ответ написан
    Комментировать