Ответы пользователя по тегу Python
  • Где использовать super?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    С помощью super() можно вызывать любые родительские методы, не только конструктор.
    Кстати, __init__ -- это не конструктор, строго говоря. Он не создаёт инстанс. Инстанс создаётся в __new__, это и есть, фектически, конструктор. А __init__ -- это инициализация. Хотя в общем-то всем пофиг и конструктором его тоже все называют. Для простоты.

    В питоне есть множественное наследование. super создаёт прокси-объект с интерфейсом к предкам.
    Ответ написан
  • Как отсортировать в словаре данные по возрастанию по одному из ключей?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    У вас это строка. И сортировка происходит в алфавитном порядке.
    Вы можете вот так сортировать:
    key=lambda x: int(x['sick'])
    Ответ написан
    Комментировать
  • Почему пайчарм в тексте ошибки пишет, что нельзя померить длину числа, хотя четко виден список, а не число?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Потому, что число - это не строка. У него нет длины.
    Если вам надо посчитать количество десятичных знаков числа, то делайте так:
    len(str(12345)) # 5
    Ответ написан
    Комментировать
  • Будет ли подобное использование eval безопасным?

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

    Оголённые провода в жилом помещении - это недопустимо, но в фазные шины с правильной маркировкой в электрощитовой, наверно, допустимы.
    Это касается не только eval.
    Однажды я слышал от студента примерно следующие рассуждения, когда ему требовалось написать простейший калькулятор:
    eval использовать нельзя (небезопасно), поэтому я пользовательский ввод записываю в питоновский файл и этот файл импортирую как модуль...
    Ответ написан
    7 комментариев
  • Как записать данные в файл на python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Во-первых, надо форматировать код специальным тегом.
    Во-вторых, у вас переменная l локальна и не видна снаружи функции.
    В-третьих, чтобы что-то записать в файл, лучше пользоваться такой конструкцией:
    with open("log.txt", "w") as f:
        f.write('any text')

    При этом файл каждый раз открывается с перезаписью, то есть очисткой всего что там было до открытия.
    Чтобы не удалялось, нужно открывать так: open('filename.log', 'a')
    Тогда файл не будет пересоздаваться поверх старого и можно дописывать к нему данные.
    В-четвертых, в питоне есть отличный модуль logging. Нагуглить статью про его использование элементарно.
    И мне не придётся это всё писать...

    Читайте книжку. Ну что вы все лезете программировать обучаясь на слухах, сказаниях и преданиях вместо чтения статей и книг, где всё изложено коротко и лаконично.
    Ответ написан
    5 комментариев
  • Как решить такую задачу в Питоне?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Попробуйте структурировать своё решение.
    Вы верно подметили быстрые предварительные критерии отрицательного ответа:
    • кусков меньше 4
    • длина цепи не кратна четырём

    Уже хорошо.
    Дальше вы можете пробовать строить квадрат цепью от угла и при каждой неудачной попытке мысленно "перецеплять" очередное звено из начала в конец цепи.
    Вам осталось придумать критерий остановки по неудаче. Не обязательно же перецеплять ВСЕ звенья цепи, достаточно делать это пока не (ЧТО?).
    Думайте. Вам не нужен готовый ответ.
    Ответ написан
  • Как спарсить эту JSON страницу?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    ну читайте же внимательно:
    print(json['result']['line'])
    TypeError: list indices must be integers or slices, not str

    json['result'] у вас это не словарь, а список, а к нему обращаться можно только по целочисленному индексу.
    print([item['line'] for item in json['result']])
    Ответ написан
    Комментировать
  • Как удалить пустой список в списке?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    лучше так:
    elms = [item for item in elms if item == []]
    А если вообще всё пустое надо убрать то так:
    elms = list(filter(None, elms))
    Ответ написан
    Комментировать
  • Что использовать для обучения на питоне?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    чтобы сеть отличала подачу (как написаны тексты)

    Святая наивность!
    По такой четкой постановке грех не решить задачу одной строчкой вообще.
    Готовой библиотеки для "сравнения подачи текста (как написано)" вы не найдёте.

    Пробуйте посчитать суммарную статистику N-грамм для всех подходящих и неподходящих текстов. Возьмите топ этой статистики (m самых часто употребимых в корпусе размеченных текстов n-грамм), зафиксируйте сортировку n-грамм и формируйте m-мерные вектора для каждого текста.
    На получившихся векторах обучайте многослойную нейронку.
    Экспериментируйте со скрытыми слоями, с размером вектора m, размером обучающей выборки, чтобы избегать переобучения и получить достаточный коэффициент правильных ответов.

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

    А так у яндекса есть какой-то инструментарий.
    Вот еще https://www.nltk.org/
    Либу для нейронок на питоне вообще найти не проблема. Любую берите с которой проще освоиться.

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

    Консультируйтесь со специалистами. Всё на свете нейронками не закидаешь.
    Ответ написан
    4 комментария
  • Как из двух массивов сделать один?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Что-то все какие-то сложно перевариваемые решения постят.
    Вот же понятно все и читабельно:
    full = {company['id']: company for company in first_list}
    for extra in second_list:
        item = full.setdefault(extra['company'], {})
        item.update(extra)
        item.pop('id', None)
        item.pop('alias', None)
    
    result = list(full.values())
    Ответ написан
    Комментировать
  • Как получить определённый кусок карты по координатам и в масштабе?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Уверен, что яндекс не в восторге от попыток скачать их тайлы для каких-то нелицензионных нужд, но вы можете сделать это притворившись браузером и соблюдая квоты, чтобы не вызвать подозрение у сервиса. Реальные квоты вам никто, конечно, не объявит и вам придётся пользоваться прокси и определять квоты эмпирически.
    Однако особой причины брать данные именно у яндекс-карт нет. OSM достаточно хорош и вам уже дали ссылку, где можно почитать про https://overpass-turbo.eu/ - инструмент для фильтрации загрузки геоданных OSM. Снапшот базы OSM можно скачать и полностью.
    База OSM - это векторные данные и метаданные гео-объектов. Существует несколько открытых бесплатных решений для рендера этих данных в тайлы. Настроить это рендер уже нетривиальная задача, поскольку нужно знать какие данные и каким стилем отображать, чтобы карта получилась информативной и эстетичной. Всегда можно найти готовые примеры стилей для рендера, а докер позволяет не ставить огромное количество зависимостей руками, но получить сервис рендера тайлов относительно легко.

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

    Есть такой сервис: https://nakarte.me/
    Весьма удобный интерфейс, чтобы быстро собрать карту в масштабе из готовой подложки и нескольких треков.
    Думаю им можно пользоваться и программно формируя по документации урлы для запросов.
    Ответ написан
    Комментировать
  • Для чего тут используется super, если класс наследуется только от object?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ну строго говоря особой нужды нет. Такое делают, например, если в будущем собираются сменить базовый класс.
    Но если у вас __init__ вообще пустой и кроме супера ничего нет, то совсем бесполезно.
    В третьем питончике, кстати, уже вот так можно:
    class Container():
        def __init__(self):
            super().__init__()
    Ответ написан
    4 комментария
  • Как в python сделать чтобы скрипт-родитель продолжал работать даже есть в скрипт-дитё выдал ошибку?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Импортируйте и запускайте код в блоке try-except.
    Ответ написан
  • Поясните что значит в sorted(values, key=lambda x: (abs(x-one), x)) последнее значение x(после запятой)?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ваша функция возвращает не один элемент, а все, отсортированные в порядке удаления от заданного.

    key=lambda x: (abs(x-one), x)
    это функция, по значениям которой сортируются элементы массива.
    Значение этой функции - кортеж из двух элементов: первый - это модуль разности, а второй это текущий элемент списка.
    Кортежи можно сравнивать на > и <. При этом они сравниваются поэлементно слева направо.
    Смысл добавления x в том, что расстояние от -1 до 0 и до -2 одинаковое и сортировка не различала эти два элемента между собой. Когда вы стали сортировать по ключевому кортежу, то при равенстве расстояния порядок определяется значением самого элемента. Выбирается сперва тот, что меньше (в вашем случае -2).
    Ответ написан
    6 комментариев
  • Проблема с импортом python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    sudo pip install mutagen
    Или в настройках пичарма:
    5ea0389a2207b643382040.png
    Справа плюсик с хинтом "Install"
    Ответ написан
    3 комментария
  • Какой бесплатный хостинг использовать для закачки файлов? И как это сделать?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    он должен скачивать файл с хостинга

    Где мне взять прямую ссылку

    Все файлохранилки разные и в большинстве своём они не хотят, чтобы их использовали для массового распространения файлов. Именно поэтому большинство из них неохотно позволяет или не позволяет вовсе формировать прямую ссылку на скачивание файлов.
    Яндекс диск, дроп-бокс, гугл-драйв - все они предоставляют вам услугу "как бы" бесплатно, но как мы знаем, если что-то вам достаётся бесплатно, то товар на самом деле это вы, ваш контент, ваша статистика, ваш кошелёк и ваше внимание (реклама). Бесплатный сыр знаете где бывает.
    Конечно всем этим хранилкам не интересно, чтобы через них на огромную аудиторию раздавали варез, порнуху, нелицензионный контент, запрещенный контент и прочее. А это неизбежно, если будет возможность сформировать постоянную прямую ссылку и дать её скачивать неопределенному кругу лиц без авторизации.

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

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

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

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

    Задавайте вопросы правильно, конкретизируйте и описывайте что вам действительно надо, а не то, как вы думаете устроен этот мир.
    Ответ написан
    Комментировать
  • Как правильно передать .wav клиенту используя socket?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Звук в этом формате - бинарные данные. Нельзя с ними работать как с текстом.
    Вы же открываете файл в текстовом режиме. Не надо так. Открывайте в бинарном, не декодируйте. Отправляйте как байты. Принимайте тоже как байты.
    К примеру символы абзацев могут быть проинтерпретированы неправильно и заменены, от этого съедут куски данных, сломается выравнивание.
    Я не понял. вы на сокетах имитируете часть http-проткокола. Зачем? Отправляйте либо с сокета на сокет в чистом виде, либо поднимите тривиальный сервер на flask и овспользуйтесь requests, чтобы не изобретать дендро-фекальный велосипед.
    Ответ написан
    Комментировать
  • Как создать сайт, чтобы в нем можно было программировать на python?

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

    1. Гуглите "python sandbox".
    2. Конкретизируйте задачу. Какой код вы хотитезапускать, хотите ли подключать сторонние библиотеки, а бинарные библиотеки?
    Ответ написан
    3 комментария
  • Как решить проблему с условием вывода и регулярными выражениями в Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    1)
    Попытки убрать блок else, либо заменить "Нет вхождения" на pass или None - выдают ошибку.

    a if q else b - это тернарный оператор. У него три аргумента (a, b, q) и результатом будет a или b в зависимости от истинности q.
    pass там по синтаксису не подойдёт, поскольку это не значение, а ключевое слово.
    Вам нужно вычислить выражение и результатом должно быть что-то что можно передать в print(). Если по else вы укажете пустую строку "", то print её напечатает. Не знаю устроит ли вас пустой абзац в консоли. Если нет, то смотрите решение, предложенное выше.

    2) в предыдущем решении вы могли не заметить, но регекспы соединены через "|". Это сработает не для всех регекспов. Нужно быть осторожнее с такой конкатенацией. Вообще с регекспами надо поосторожнее. В большой силе большая ответственность.
    Можно сделать цикл и поискать каждый регексп по отдельности. Так вам проще сохранить контроль над тем, что именно вы нашли и как на это реагировать.
    Ответ написан
    1 комментарий