• Python exception, какой будет правильным?

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

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

    Если ваш скрипт должен во что бы то ни стало работать и никогда не падать в продакшн-режиме, то можно поступить так:
    По факту KeyboardInterrupt делайте её рерайз. Остальные ошибки подробно логируйте и двигайтесь дальше:
    for item in items:
        try:
            ...
        except KeyboardInterrupt:
            raise
        except Exception as e:
            with open('errors.log', 'a') as log:
                log.write(f'{e}')
                # сюда же можно вывести трейсбэк, но я бы воспользовался стандартным логированием, чтобы не изобратать велосипед, однако его конфигурирование выходит за рамки данного отета.
    Ответ написан
    Комментировать
  • Как организовать docker-compose для микросервисов на локальной машине для разработки?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Основное отличие микросервисов от монолита в том, что они более автономны и изолированны друг от друга. Общаться между собой они, кстати, могут не только по http, чаще это происходит через очереди RMQ или кафку какую-нибудь.
    Если несколько микросервисов у вас будут хранить данные в одной БД или вообще в одной таблице, то это несколько ухудгает изоляцию и ваша микросервисаня архитектура снова начинает пахнуть монолитом, только затейливым таким монолитом, поскольку, возможно, вы на следующих этапах захотите вынести общий код из микросервисов в какие-то библиотеки, начнете импортировать одни и те же модели разными "микросервисами". И получите в итоге тот же монолит со всеми его недостатками, а достоинства микросервисной архитектуры потеряете, приобретя при этом её недостатки.

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

    Для разработки и отладки вы обычно изолированы в своём микросервисе, вам может быть достаточно для девелоперских нужд докер-компоуза, который поднимет вам БД, nginx, очереди и что вам там еще надо для нужд локальной отладки и тестирования.
    Ответ написан
    Комментировать
  • Как разбить массив на подмассивы используя "0" как разделитель?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Без сторонних либ я бы делал так:
    def split0(arr: list) -> list:
        res = [[]]
        for x in arr:
            res[-1].append(x) if x else res.append([])
        return res

    А вот для любителей функциональщины:
    from itertools import takewhile  
    def split0(a): 
        it = iter(a) 
        return [[x for x in takewhile(bool, it)] for _ in range(a.count(0) + 1)]
    Ответ написан
    2 комментария
  • Что тут надо отпаять/припаять что оно заработало?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Начнём стого, что это не bluetooth мышки, а простые с радиолинком. Для блютус мышей донгл обычно в комплекте не поставляется, поскольку расчет идет на то, что в компьютере уже встроен блютуз. Во всех ноутбуках почти он есть.
    Если мыши разные, то, скорее всего, у вас не получится ничего перепаять. По крайней мере следует детально сфотографировать мышь-донор и мыш-рецепиент, их платы с о всех сторон, внутренности донгла.
    Если мыши одинаковые, то можно посто плату из разбитой вставить в живую целиком. Если повреждены кнопки, перепаять их.
    Ответ написан
    7 комментариев
  • Как в django можно реализовать транслит url адресов?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Вот есть детальная каноничная окументация как такое делать
    https://learndjango.com/tutorials/django-slug-tutorial
    Если вам нужно удовлетворить какие-то свои изощренные хотелки, то, предполагается, что у вас уже достаточно опыта, чтобы обосновать таковые как с точки зрения производительности, так и с точки зрения архитектуры.
    Я не понимаю вот этого "не хочу". Детализируйте причину этого? У вас джанго лишь для рендера статического контента и вам не нужна индексация? Вы как-то глубоко переделали индексы и БД, чтобы отдельное поле было не нужно или выглядело слишком сложным?

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    [''.join(letters) for letters in itertools.product(string.ascii_uppercase, string.ascii_uppercase)]


    То же, но красивенько:
    [
        ''.join(xy)
        for xy in itertools.product(*(string.ascii_uppercase,) * 2)
    ]
    Ответ написан
    1 комментарий
  • Как преобразовать список в диапазон?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    years[1] += 1
    range(*years)

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

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Отсортировать и указать лимит выдачи. Буквально. А в чем вопрос? Что у вас не получилось?
    Ответ написан
    7 комментариев
  • Какую модель контроллера температуры с возможностью отправки данных по GSM использовать?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Можно взять с алиэкспресса ардуинку и GSM-модуль. К ардуинке подключаете по 1-wire сколько хотите датчиков DS18B20 с того же алиэкспресса.
    AT-командами заставляете GSM-модуль сделать подключение к вашему серверу и проксиовать туда UART с ардуинки. Ардуинка будет периодически снимать температуру с датчиков и слать их в GSM-модуль.
    Если частота опроса датчиков высокая не нужна, то имеет смысл усыплять GSM-модуль в периоды между отправками данных.
    Ответ написан
  • Что такое "типы данных" в Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Все типы данных - это классы, но не все классы - это типы данных. Хотя классы - это типы=) но не буду вас путать.
    "map, range, срез" - это не типы данных.
    Полагаю в том вашем вопросе од типами жанных имеют в виду простые типы вроде строк, чисел с плавающей точкой, целых чисел и даже комплЕксных.
    Кортежи (tuple) и словари (dict) - это уже структуры данных, коллекции... как угодно. Да, технически это тоже классы и в каком-то смысле их можно назвать типами, но все эти терминологические дебри вам ни к чему.
    Просто считайте типами данных атомарные значения простых типов. Если к вам докопаются при таком понимании, то надо таких слать=).
    Дальше интереснее. range, к примеру, это класс, инстанс которого "умеет" делать генератор арифметических последовательностей. Вот это вот слово "умеет" связано с питоновским понятием протоколов. К примеру, если к объекту можно обратиться по индексу, значит он поддерживает соответствующий протокол __getitem__. Если объект поддерживает срезы, то в этот метод можно подать специальный объект - инстанс slice. Этот инстанс просто несёт три параметра среза (начало, конец и шаг), а как его будет применять объект - это на откуп программисту.

    Вам, надо, наверно, еще понимать разницу между изменяемыми и неизменяемыми объектами, но... мне кажется вы решили избежать чтения учебников и планомерного изучения языка, а просто решили приёти сюда за персональным репетитором, который станет тут тратить своё время на объяснение тривиальных вещей из каждого первого учебника?

    Просто доверьтесь одному из учебников и не пытайтесь перепрыгнуть через голову.
    Ответ написан
    3 комментария
  • Вопрос про sqlite?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    sqlite БД - это просто файл, чтобы подключиться к такой БД можно скачать его или примонтировать файловую систему сним к локальной, например, через SSH. В случае больших БД будут проблемы с производительностью. Если вам нужно делать это штатно, регулярно, в проде, да еще и с разных клиентов, то использовать надо какие-то другие БД, а не sqlite.
    Ответ написан
    3 комментария
  • Как в Python Datetime сделать так, чтобы менялся год и месяц?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Можно подобрать одну из хороших мощных библиотек для удобной работы с дантами, чтобы там были методы перелистывания дат помесячно.
    Но если не хочется плодить зависимости, то я рекомендую штатно разобрать дату на день, месяц и год, убедиться, что день не превышает 28 (иначе такое число не в каждом месяце найдётся), а затем прибавить к месяцу 1 по модулю 12. В случае переполнения нужно увеличить еще и год.

    Такое элегантно записыается с помощью функции divmod:
    month -= 1
    year_increment, month = divmod(month + 1, 12)
    month += 1
    Ответ написан
    Комментировать
  • Что такое range() в Python 3?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В целом всё верно. range реализоан как класс, при его инстанцировании (или вызове в качестве функции. что в питоне, суть, одно и тоже) формируется инстанс этого класса, который поддерживает протокол получения итератора.
    Если воспользоваться этим протоколом (iter(range(3, 33))), то получим итератор - инстанс класса range_iterator.
    Ещё инстанс range позволяет получать доступ к элементам по индексу, делать срезы, инвертировать, получать количество элементов, проверять на вхождение элемента и т.д.
    Ответ написан
    1 комментарий
  • В чем проблема с выводом?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Для большей ясности стоило бы приести пример выхлопа команды
    occtl --json show users
    Чтобы отвечающим не приходилось ставить VPN-сервер и подключать тестовых пользователей.
    Сходу видно, что вы запрашиваете результат в формате json, а затем парсите его грепами и awk'ом, что крайне бессмысленно и беспощадно. Почему бы не использовать jq для этой цели, а не пытаться забить шуруп молотком.
    Приведенная вами проблема связана с тем, что, вероятно, выхлоп в виде json происходит без гарантии порядка ключей, а ваш способ доставать из него данные весьма варварский.

    Да и проблемы в таком подходе на этом не ограничатся, ведь список пользователей может измениться между итерациями и даже между получаением имени и ip.
    Следовало бы единоразово получить все сырые данне, а затем вытаскивать из них нужное.
    Ответ написан
    Комментировать
  • Как удалить отступ добавляемый help для docstring?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Никак. Все отступы ровненько отрезаются форматировальщиком help и добавляется один отступ.
    Зачем вам этой дичью заниматься приспичило?
    Ответ написан
  • Как воспользоваться указателями в python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Тут, похоже, имеется непонимание, как в питоне устроены переменные и чем они отличаются от переменных (и отчасти указателей) в Си.
    В Си (и не только, в паскале, например, тоже) переменная - это коробочка, которая уже есть и в неё можно что-то положить подменив какой-то мусор, который там был раньше, потом её содержимое можно заменить.
    В Питоне переменноая похожа на ярлычок. Ярлычок - это имя, а всё вокруг - это объекты. На один объект можно повесить много ярлычков (представьте себе ярлычок от чайного пакетика). Каждый ярлычок - это отдельное имя или позиция в списке, кортеже, словаре...) Обхект один, а ссылок на него может быть много. Ярлычок можно уничтожить или перевесить на другой объект. Когда не остаётся ни одного ярлычка, привязанного к объекту, он становится кондидатом на удаление и освобждение памяти.
    Вам в соседнем ответе показали как можно элегантно обменять именами два объекта в питоне. Да, именно, поменяются местами имена, но объекты как были так и останутся. Это как поменять таблички на кабинетах директора и главбуха.
    Так что отчасти все переменные в питоне - это умные слабые ссылки.
    Ответ написан
  • Какие модули к ардуино нужны для распознования объектов и построения карты?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    На хабре была статья о том, как получать изображение с оптического датчика компьютерной мыши.
    https://habr.com/ru/post/128972/
    По идее единственным этим датчиком вполне можно было бы обойтись для прототипа, ведь мышь умеет оценивать перемещение даже по чистому листу.
    Можно добавить энкодеры на колёса и применить метод Калмана для повышения точности и устойчивости определения координат. Для хранения растровой картинки с тем разрешением, с которым "видит" оптический сенсор мыши 600-1200dpi в стоковой ардуинке не хватит памяти, так что можно действительно гнать данные (смещения и картинки) на комп (или смартфон), а там уже обрабатывать и отсылать команды для моторов робота.
    Можно взять ESP-cam и приколхозить линзу с подсветкой, тогда можно пробовать формировать картинку на девайсе, например на флешке.
    Эффективнее сделать штангу с подвижным сенсором и ровно едущего робота, или взять сенсор от готового сканнера. Лет 20 назад у моего друга был ручной сканнер, который нужно было возить по бумаге, чтобы отсканировать лист. По вращению колёс сканнер понимал с какой скоростью его тянут. Если вести аккуратно, получалась вполне сносная картинка, но только в случае одного прохода.
    Само собой с оптическим сенсором от мыши у вас робот будет сканить А4 долго и муторно, причем в ЧБ.
    Вообще проще фотать лист сверху смартфоном=).
    Ответ написан
    Комментировать
  • Как узнать причину отключения WIFI?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Запустите в терминале
    dmesg -w
    и оставьте висеть так.
    Когда вайфай снова рубанётся - мотрите что пишет.
    По тому что напишет можно потом погуглить.
    Ответ написан
    Комментировать
  • Какой дистрибутив linux выбрать для домашнего сервера?

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

    Если подъём всей домашней серверной инфраструктуры сводится к клонированию приватного репозитория с докер- и компоуз-файлами и запуском всего одной строчкой, то переехать на новый сервер становится тривиальной адачей, а вся конфигурация и зависимости прозрачно задекларированы в докерр-файлах.

    Часто быает, что настраиваешь всё долго и нудно, а потом спустя пару месяцев или год всё по новой, потому что всё уже забылось как и что было настроено.

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