• Как задавать места, в которых интерпретатор python осуществляет поиск?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Помимо способа, указанного в соседнем ответе, есть еще способ сделать это из самой программы на питоне:
    import sys
    
    sys.path.append('some/custom/path/to/modules_and_packages_collection_folder')
    Ответ написан
    Комментировать
  • Как вывести отличающиеся (ключ, значение) одного словаря от другого словаря?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы как-то не очень четко поставили задачу.
    1. Нужно прояснить следующие важные детали:
    2. У различной пары может отличаться как ключ, так и значение по отдельности?
    3. Наборы ключей одинаковые? Неодинаковые? Могут отличаться?
    4. Значения хешируемые?
    5. Количество пар совпадает, или одна пара в одном из словарей может отсутствовать?
    6. Одна и только одна пара?
    7. Какая версия Питона? Если третья, то словари одинаково упорядочены по ключу? Может быть они еще и отсортированы? Ну мало ли...
    8. Насколько большие словари? Их размер сопоставим с полным объёмом памяти?
    9. Ваша задача выглядит так, будто имеет смысл решать её немного в другом месте и в другое время (в смысле формирования структуру данных и заполнения их). Поясните почему такая задача возникла, возможно есть другой, более элегантный и эффективный подход, нежели сравнивать большие словари.


    Похоже вот это будет для вас приемлемым решением:
    import typing
    
    def ddif(a: dict, b: dict) -> typing.Iterable[tuple]:
        return filter(None, (None if va == b[k] else (k, va, b[k]) for k, va in a.items()))
    
    a = {1: 11, 2: 22, 3: [1, 2, 3], 4: 44, 5: 55}
    b = {1: 11, 2: 22, 3: [1, 2, 4], 4: 44, 5: 56}
    for k, v1, v2 in ddif(a, b):
        print(f'{k}: {v1!r} != {v2!r}')

    Там возвращается итератор, поэтому, если вы уверены, что различие только одно, то можете воcпользоваться islice, чтобы остановиться на первом различии:
    from itertools import islice
    print(
        list(islice(ddif(a, b), None, 1))
    )
    Ответ написан
    2 комментария
  • Можете подсказать сервисы по картам и геопозиции?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Ответ написан
    Комментировать
  • При попытке проверки переменной выдаёт ошибку, что делать?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вам же белым по черному в тексте ошибки написано, что переменная country используется до объявления. То есть в программе вы еще ни разу в нее ничего не присвоили, а уже пытаетесь проверять ее значение. КОнечно тут ошибка.
    Там даже показано в какой именно строке. Что делать? Исправлять.
    Ответ написан
    Комментировать
  • Где ошибка в коде?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    замените
    c = Canvas(window, width=WIDTH, height=HEIGHT, bg="darkblue").pack()

    на
    c = Canvas(window, width=WIDTH, height=HEIGHT, bg="darkblue")
    с.pack()

    Иначе в переменную c попадает результат выполнения метода .pack(), который None, а не ожидаемый вами экземпляр канваса
    Ответ написан
    Комментировать
  • Как сделать нахождения определенных ников в тексте?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Ну так а в чем у вас проблема? В том, что вы не можете это сделать? Не знаете с чего начать?
    Эта задача никак не относится к тегу "Распознавание текста".
    Вам достаточно найти в тексте все строки, чоответствующие регулярному выражению и напечатать их.
    Если вам нужно, чтобы эту задачу кто-то для вас решил на этом ресурсе, то это не тот ресурс.
    На каких форумах вы лазили? Как искали? СОВСЕМ ничего не нашли?
    Звучит как-то неправдоподобно.
    Задавайте конкретные вопросы, а не задания.
    Ответ написан
    Комментировать
  • Почему поверхностная копия не изменяет значение?

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

    В Питоне переменная - это как ярлычок с именем. При присвоении вы, как бы, вешаете ярлычок на объект:
    x = [1,2,3]
    y=x
    И у вас теперь есть два ярлычка: x и y. Оба привязаны к одному и тому же объекту.
    Если вы этот объект измените (отредактируете элемент), то не важно как вы к нему будете обращаться, по какому из имён.

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

    Представьте, что в вашем объекте (Заявка) два атрибута: Имя_клиента и Адрес_квартиры.
    Вы копируете заявку поверхностно. Меняете имя в одной из копий, а во второй всё осталось как было. Делаете ремонт в квартире по указанному адресу. Само собой алрес в обеих копиях заявки один итот же и вы его не меняели. Вы меняели объект по этому адресу.

    Теперь вы берете заявку и делаете её глубокое копирование:
    Тут начинается проблема у аналогии, но это нам не помешает.
    Вы меняете имя в копии и тут всё работает как в прошлом примере.
    Но при создании глубокой копии создалась новая абсолютно такая же квартира но с новым адресом. В копии заявки адрес уже другой. Если вы сделаете ремонт в квартире по новому или старому адресу, то на другой квартире это не отразится.
    Ответ написан
    Комментировать
  • Как перехватить ошибку ConnectionRefusedError: [WinError 10061]?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    try:
        # ... код, порождающий ошибку
    except ConnectionRefusedError as e:
        # код обработки ошибки
    Ответ написан
    Комментировать
  • В чём разница между list() и []?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Там всё просто.
    Считайте, что list - это функция, которая принимает перечисляемый объект и возвращает список с извлеченными из этого объекта элементами.
    [], [1,2,3] - это "синтаксический сахар" для удобной записи готовых списков в коде. Первый из этих двух примеров пустой, а второй содержит три элемента. Эта запись подразумевает, что элементами будут выражения, записанные в квадратных скобках через запятую.

    Так что list() и [] действительно вернут одинаковый результат, но если речь не о пустых списках, то функция извлечет элементы из своего аргумента, а [1,2,3] примет в качестве элементов то, что внутри через запяту.

    Прочитайте лучше систематически в книжке того же Лутца. Иначе вы своими догадками ни язык нормально не освоите, ни время не сэкономите.
    Ответ написан
    3 комментария
  • Что бы вы хотели увидеть в сервисе ФИАС?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Посмотрите что предоставляет dadata. У них есть что можно повторить в своём сервисе, например, нормализация адреса.
    Ещё прикольная штука для всякого рода голосовых помощников - это корреляционные выборки.
    Поясню.
    Пользователь разговаривает с ботом. В нём идёт речь о Париже или селе Ольховатка. Таких населенных пунктов сильно больше одного. Особенно Ольховаток. Однако какие-то ольховатки от пользователя в тысячах километров, а одна в десятке км. Какую из них скорее всего имеет в виду пользователь?

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

    Написал сумбурно, но этого не хватает.

    Вообще прикольно было бы иметь еще базу алиасов и синонимов топонимов.
    Питер, Санкт-Петербург, Ленинград - это алиасы одного населенного пункта.
    Ответ написан
    1 комментарий
  • Что можно сделать с раскрученым доменом?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Что можно сделать с раскрученым доменом?

    -- Запустить (во всех смыслах этого слова)
    Ответ написан
    Комментировать
  • Скрипт Rsync для нуба?

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

    Постойте, ведь это совершенно новая идея! Наверняка никто не додумался ещё во всём мире делать инкрементальные бэкапы rsync'ом!
    Похоже, вы первый во всей галактике, кому это понадобилось.

    Я пошел даже в гугл и проверил запросом "инкрементальный бэкап rsync".
    И знаете что?
    Оказывается там полно статей про это!

    Даже не знаю... странно...
    Ответ написан
    1 комментарий
  • Как найти и удалить плагин SQLScout в Pycharm?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Так я и не понял, решили вы проблему для себя или нет?

    Нужно найти каталоги вида:
    %HOMEPATH%\\.<product><version>\config\plugins
    Показать здесь их содержимое.
    Указать версию всех продуктов JetBrains, установленных в системе.
    Удалить все следы проблемного плагина.
    Ответ написан
    1 комментарий
  • [Python] Как сделать передвижение строки?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Могу предложить для ясности вот такое решение:
    import sys 
    from time import sleep 
    
    def cut_frame(s: str, start_pos: int = 0, frame_size: int = None) -> str: 
        frame_size = frame_size or len(s)
        left_space = ' ' * min(start_pos, frame_size) 
        if start_pos < 0: 
            s = s[-start_pos:] 
        return f'{(left_space + s)[:frame_size]:{frame_size}}' 
    
    
    def scroll(s: str, frame_size: int = None, timeout: float = 0.1, template: str = '[{}]', file=sys.stdout): 
        frame_size = frame_size or min(len(s), 80) 
        for i in range(-len(s), frame_size + 1)[::-1]: 
            substring = template.format(cut_frame(s, i, frame_size)) 
            print(substring, end='\033[0G', flush=True, file=file) 
            sleep(timeout)

    В виндовом терминале не пробовал, но если ANSI-последовательности поддерживаются, то должно скроллиться как положено.
    Ответ написан
  • Как создать онлайн-аудиоредактор?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Во-первых, определитесь с набором функциональности. audiodenoise - не полноценный редактор, там просто загрузка, обработка и получение файла обратно. Онлайн-редактором это называть странно.
    Во-вторых, чётко сформулируйте ТЗ. Оно вам пригодится в записке к дипломной работе.
    В-третьих, разработайте лаконичный и удобный API, опишите его в формате openapi.
    Затем уже можно приступать к реализации. Она у вас будет состоять из бэкенд аи фронтенда.

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

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

    Приходите с конкретными вопросами, когда у вас будет ТЗ или, хотя бы, подробный фичлист
    Ответ написан
    3 комментария
  • Изучение Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    https://otus.ru/
    На любой вкус вообще.
    Ответ написан
    Комментировать
  • Python как перебрать значение по ключу в список?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вот так, например.

    from itertools import groupby
    
    [
        dict(
            name=name, 
            id=id, 
            pos=[subitem['pos'] for subitem in subitems]
        ) 
        for (name, id), subitems in 
        groupby(
            dic, 
            lambda item: (item['name'], item['id'])
        )
    ]

    Только у вас там, похоже, ошибка в примере для случаев с одиночными вхождениями. Не хватает двойного вложенного списка.
    Если нужно именно так, то нужно будет добавить "раздевание" одноэлементных списков.

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Ок, Алиса, привет!

    1. самые разные защиты бывают. Самые неудобные - это самопальные плееры, для которых ешё не набралось критической массы желающих скачивать контент, чтобы сделать плагин к youtube-dl.
    2. Отсутствие ссылки на скачивание; доступность видео для просмотра только под авторизацией, что может помешать использовать youtube-dl.
    2. Не узнает скорее всего.

    Всегда есть возможность захвата видео с экрана. Пострадает качество, придётся потратить на захват время, равное длительности курса, но такой захват очень сложно предотвратить. В крайнем случае как в древности -- снимете экранку с монитора на телефон=).
    Ответ написан
    2 комментария
  • Как получить повернутую линию?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Что значит повернуть на 47%? Процентов от чего? От 180 градусов, от 360?
    Вокруг какой точки повернуть?

    Положите на стол карандаш. Относительно левого ближнего угла стола у него заданы координаты концов. Можете померять линейкой x1, y1, x2, y2.
    Теперь поворачивайте карандаш на 47%. Я бы даже видос такой глянул.
    Ответ написан
    2 комментария
  • Как получить человекопонятные символы в кодировке UTF-8?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Продам участок - 35

    это выглядит, будто вы смотрите на utf-8 через неправильно настроенный просмотрщик, который пытается читать текст, будто он в 1251 кодировке.

    Давайте объясню. Unicode - это не кодировка, это просто номенклатура большого количества самых разных символов. Этих символов сильно больше чем 256, а именно столько (256) значений может быть записано одним байтом.
    Напомню. что у нас в компьютерах всё хранится в виде байтов и их последовательностей. Но один байт - это слишком мало для вычислений, поэтому их объединияли в "слова". Короче сперва регистры в процессоре были 2 байта (16 бит), потом 4 байта (32 бит), сейчас повсеместно завоёвывает позиции 64-битная архитектура. Грубо говоря это значит, что одной операцией процессор обрабатывает вот эти вот 4 или 8 байт. Но в каком порядке идут эти байты в такой группе? Вот тут тоже есть разница на разных платформах и там вообще мрак. Но как-то с этим живем.

    Итак, нужно байтами записывать символы, которых очень много. Надо, чтобы эти байты можно было передать по сети другому компьютеру, возможно с другой архитектурой и другим порядком байт в "слове". Многим не нужны вообще все символы. Кому-то хватает только английских букв/цифр и некоторых знаков -- такой набор не превышает числом 128 символов (ASCII кодировка).
    Что такое кодировка? Это способ задать одним или несколькими байтами конкретный символ. У кодировок разные наборы этих символов. Текст - это последовательность символов. В конкретной кодировке он задаётся последовательностью байт. Чтобы прочитать текст, нужно знать в какой он кодировке, брать байты (зная кодировку мы понимаем какие символы им соответствуют) и рисовать символы.

    Исторически сложилось, что в windows в русской локали используется сразу две разных однобайтовых кодировки: cp1251 и cp866. Первая половина из 256 символов в них одинаковая, как в ASCII, а во второй русские буквы на совершенно разных местах стоят. Текст из одной кодировки в другую перевести можно однозначно, но нужно менять номера по специальной таблице.

    А потом люди захотели очень разных символов, всякие иероглифы и пиктограммы. Это всё не поместится в байт и появились много байтовые кодировки. ASCII-символы там кодируются одним байтом, часто употребимые двумя, тремя, редкие, могут потребовать и больше байт. Есть сложный алгоритм, который говорит как превратить Юникод-символ с номером таким-то в набор байтов. Для каждой кодировки этот алгоритм свой. Для однобайтовых кодировок он сильно проще.

    Регулярно чередующиеся символы в вашей строке примера - это те самые вторые байты символов. Заметьте, что ascii-символы представлены однобайтово. Это utf-8, на которую смотрят как на 1251 или какую-то другую однобайтовую кодировку.
    То есть пытаются представить каждый байт в виде отдельного символа.

    В итоге.
    У вас есть файл в UTF-8. Открывайте его правильным редактором с правильными настройками и будет у вас всё видно правильно. Либо кодируйте в cp1251 файл при записи, тогда таким образом он у вас откроется читабельно.
    Ответ написан