Ответы пользователя по тегу Python
  • Почему здесь используется базовое исключение Exception?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Это не безусловный антипаттерн. Если вы в блоке except логируете или перевыбрасываете исключение (как в вашем примере) - то норм, даже линтер не ругнëтся.
    Ответ написан
    Комментировать
  • Как безопасно выгрузить данные из pickle-файла, модифицировать их, и обратно сдампить в Pickle?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Давайте начнём с того, что откроем для себя, как пикл сериализует классы:
    >>> class MyKnowHowClass:
    ...   SECRET = '42'
    ...   TOP_SECRET = 'Kennedi was killed by UFO'
    ... 
    >>> import pickle
    >>> pickle.dumps(MyKnowHowClass)
    'c__main__\nMyKnowHowClass\np0\n.'
    >>>


    То есть, это всего лишь "указатель", описание того, откуда брать структуру данных. Если пикл не найдёт класс там, где указано - будет ЕГГОГ.
    Встроенные типы - ок. Наполняйте встроенные типы (списки, сеты, словари и т.п.) такими же встроенными типами (то же самое + скаляры) - и будет вам автономный пикл.
    А с пользовательскими классами - не-а.

    UPD:
    Если у вас экосистема, и тем более большая, и тем более уже выдумали "формат" - наверняка уже должны быть решены многие вопросы. Например, вопросы безопасности (ваш п.4), вопросы о загрузке-выгрузке (п.3), да и много чего можно посмотреть существующего и работающего на тему лучших практик по остальным двум пунктам.
    Ответ написан
  • Как сделать, чтобы функция начала работать с итераторами?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Не надо кушать лишней памяти, и лишний раз ходить по итератору тоже.
    def all_unique(iterator):
        counter = 0
        items = set()
        for item in iterator:
            items.add(item)
            counter += 1
            if len(items) != counter:
                return False
        return True

    Худший случай, конечно, всегда один для данной задачи: О(N) и по памяти, и по времени. Но в лучшем случае может хватить всего лишь 2 итерации цикла и множества из 1 элемента (это когда в итераторе 2 первых элемента уже одинаковые), а в среднем будет что-нибудь типа O(N/2).
    Ответ написан
    Комментировать
  • В чём отличие @Decorator от @Decorator()?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Декоратор - это функция, которой на вход подаётся функция и вернуть он должен тоже функцию. Например:
    @decorator 
    def foo():
     ..

    Эквивалентно foo = decorator(foo)

    Теперь про случай из вопроса. В качестве декоратора вместо обычной функции вы используете класс (точнее его объект):
    @FuncDec()
    def foo():
        print('Hello')

    Эквивалентно foo = FuncDec()(foo), а именно:
    • создаётся объект FuncDec (вызывается конструктор __init__)
    • этот объект вызывается (__call__) вместе с параметром foo
    • объект вернул функцию wrapper, которая и будет в дальнейшем выполняться вместо объявленной foo
    • профит

    Но если убрать скобки, то получится эквивалент foo = FuncDec(foo)
    То есть просто вызов конструктора, который у вас не принимает параметров - поэтому и ругается.
    Ответ написан
    Комментировать
  • Как решить ошибку Identation error?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Это все из-за кнопки "Хакнуть Пентагон" (Да, я успел увидеть, потом вы отредактировали текст вопроса).

    Видите ли, в питоне встроена защита от причинения любого ущерба национальной безопасности США. Если интерпретатор при анализе текста программы видит, что вы собираетесь сделать что-то непоправимое, он выбрасывает ошибку и отказывается выполнять такую программу. Спецы говорят, обойти эту защиту вряд ли получится.
    Ответ написан
    1 комментарий
  • Python GIF to APNG как?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    возможн ли как то напрямую через сам PIL сконвертировать gif в apng?

    Что значит "напрямую"? Что вы в данном контексте вкладываете в это слово?
    Вы форматы GIF и APNG знаете? Я лично нет, но по ощущениям работы с инструментами по созданию анимированных гифок в лихих нулевых - в GIF-файле банально куча картинок-кадров + задан промежуток смены "кадров". Никаких, боже упаси, "потоков" и кей-фреймов, как в нормальных видеоформатах.

    Чем не понравилась либа apng? Я посмотрел - она похожа на живую, а pillow указана как опциональная зависимость (без неё возможна работа только с PNG).

    Однако сам то pil вполне себе умеет вынимать кадры... в общем кривые костыли

    Да никаких костылей. Если вы знаете, как извлечь все кадры из гифки, то у вас задача уже решена, по факту. Написать надо строк 10-15 кода, и всего делов.

    Любой конвертер из одного формата в другой будет оперировать кадрами, никаких тут "напрямую" и вообще ничего зазорного - нет.
    Ответ написан
    Комментировать
  • Почему код не работает(простенький калькулятор)?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    while True:
      abc=input("+ или - ?\n")
      if abc in ["+", '-']:
        break
      else:
        continue
    Ответ написан
    1 комментарий
  • Не могу понять, почему python выкидывает исключение?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Вы результат преобразования никуда не сохраняете.
    Вот так работает без ошибок:
    a = input()
    b = input()
    l = input()
    N = input()
    
    a = int(a)
    b = int(b)
    l = int(l)
    N = int(N)
    
    lenl = 2 * l
    lena = (2 * N - 1) * a
    lenb = 2*b *(N - 1)
    sumlab = lenl + lena + lenb
    print(sumlab)


    или можно преобразовать сразу там же, где происходит ввод:
    a = int(input())
    b = int(input())
    l = int(input())
    N = int(input())
    
    lenl = 2 * l
    lena = (2 * N - 1) * a
    lenb = 2*b *(N - 1)
    sumlab = lenl + lena + lenb
    print(sumlab)
    Ответ написан
    2 комментария
  • Как можно readlin()-ом построчно читать текстовый файл, игнорирую управляющую последовательность \x?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Ваш случай - смешанный тип файла, текстово-бинарный. Его надо читать как бинарный, обрабатывать данные можно тоже в бинарном режиме. Если нужно, на завершающих этапах обработки можно необходимые данные попытаться преобразовать в текст (в блоке try-catch).
    import re
    
    reg = re.compile(rb'([0-9]*)\>([0-9]{4}\-[0-9]{2}\-[0-9]{2}\ [0-9]{2}\:[0-9]{2}\:[0-9]{2}\ \+[0-9]{4})\ (.*)')
    with open('1933.log', 'rb') as f:
        for s in f:
            s = s.strip(b'\r\n')
            l = re.split(reg, s)
            chunks = [e for e in l if e]  # не силён в регулярках, в массиве почему-то оказываются пустые строки
            if len(chunks) != 3:
                continue
            code, datetime, payload = chunks
            print(code, datetime, payload)
    Ответ написан
    Комментировать
  • Как в python превратить число секунд в дату и время?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    import datetime
    
    MY_UTC_EPOCH_START = 1262304000  # 00:00:00 01.01.2010 UTC
    
    def my_utcfromtimestamp(ts):
        return datetime.datetime.utcfromtimestamp(ts + MY_UTC_EPOCH_START)

    Функция работает полностью аналогично стандартной datetime.datetime.utcfromtimestamp, только лишь применяя поправку на начало вашей "UTC эпохи" (полночь 1 января 2010 по Гринвичу):
    >>> my_utcfromtimestamp(1)
    datetime.datetime(2010, 1, 1, 0, 0, 1)
    >>> my_utcfromtimestamp(123)
    datetime.datetime(2010, 1, 1, 0, 2, 3)
    >>> my_utcfromtimestamp(3600)
    datetime.datetime(2010, 1, 1, 1, 0)
    Ответ написан
    Комментировать
  • Есть модули для изображений по мимо "pillow"?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    from PIL import Image, ImageGrab, ImageFont, ImageDraw
    tatras = Image.open("screen.png")
    rotated = tatras.rotate(-30, resample=Image.BICUBIC, expand=True)
    rotated.save('tatras_rotated.jpg', quality=90)

    Поиграйтесь с параметрами rotate (не все фильтры могут быть использованы для операции поворота изображения, BICUBIC вроде самый лучший) и параметрами save для оптимального "размер-качество".
    Возможно, если перейдёте на работу с PNG вместо JPEG, будет вообще шоколадно, но это вам надо потестировать.

    Сохраняйте в png, в общем, там артефактов я не обнаружил:
    rotated.save('tatras_rotated.png')
    Ответ написан
    1 комментарий
  • Почему не происходит замены подстроки в строке?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Функция replace возвращает новую строку. Строго говоря, замена происходит, но только последнего элемента из ngreplacement.
    Но чтобы работало так, как вы и задумывали, надо чутка подправить код в районе цикла: https://ideone.com/WlNOy0
    Ответ написан
    Комментировать
  • Как передать значение QPushButton из QTableWidget в функцию?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Сам qt не знаю, но.
    self.tableWidget.setCellWidget(a1, 3, self.Btn)
    Смущает меня эта строка.
    Если я правильно её понял, вы помещаете в эту ячейку кнопку self.Btn, которая была где-то предварительно создана, перед вашим циклом. То есть, вы в N ячеек размещаете одну и ту же кнопку, вместо того, чтобы создавать кнопку для каждой строки.
    self.Btn.clicked.connect(lambda: self.DownloadProcessDef(a1))

    Тут вы, скорее всего, назначаете обработчик этой кнопке. И если в qt возможен только один обработчик события, то логично, что срабатывает последний прикреплённый.
    Ответ написан
  • Важно ли поддерживать зависимости в Питоне с помощью virtualenv и virtualenvwrapper?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Что вы имели ввиду под словами поддерживать зависимости?

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

    virtualenvwrapper - это инструмент для более удобной работы с python virtual environment
    Установка в систему. Это нужно сделать один раз:
    $ pip install virtualenvwrapper
    Установка домашней папки для virtualenvwrapper. Это нужно делать каждый раз, либо добавить в .bashrc / .profile файл, чтобы это выполнялось при запуске shell'а:
    $ export WORKON_HOME=~/Envs
    Выполняем virtualenvwrapper.sh, тем самым загружая в текущий shell-сеанс команды virtualenvwrapper (которые будут исполняться далее). Это нужно делать каждый раз, либо добавить в .bashrc / .profile файл, чтобы это выполнялось при запуске shell'а:
    $ source /usr/local/bin/virtualenvwrapper.sh
    Команда mkvirtualenv из virtualenvwrapper - создание виртуального окружения с именем my-venv. Это делается, собственно, только тогда, когда вы хотите создать новое виртуальное окружение:
    $ mkvirtualenv my-venv
    Команда workon из virtualenvwrapper - "активация" виртуального окружения с именем my-venv. Это нужно делать тогда, когда вы хотите "войти" в виртуальное окружение и работать в нём:
    $ workon my-venv
    Ответ написан
    5 комментариев
  • Как в intersection задать упорядочение?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Да, вам нужна структура данных, подобная множеству, но с сохранением порядка элементов.
    Возьмите OrderedSet отсюда.
    Код с использованием OrderedSet:
    from django.utils.datastructures import OrderedSet
    a = ['Мышь', 'Дом', 'Home', 'Лом', 'a', 'z']
    b = ['Мышь', 'Лом', 'z', 'jo']
    OrderedSet(a) & OrderedSet(b)

    Получится:
    OrderedSet(['Мышь', 'Лом', 'z'])
    Ответ написан
    1 комментарий
  • Почему кол-во элементов в списке равно 0?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Не strip, а str.split:
    string = 'foo.bar.test.ru'
    length = len(string.split('.'))
    print(length)

    https://ideone.com/IabPw7
    И не рекомендуется перекрывать именами своих переменных стандартные типы (это я про str)
    Ответ написан
    Комментировать
  • Почему не получаю json-объект?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Как научиться работать с API VK:
    • научиться читать
    • научиться читать документацию
    • научиться читать документацию к API VK
    • перестать заваливать тостер базовыми вопросами о VK API


    https://vk.com/dev/photos.getWallUploadServer :
    Возвращает адрес сервера для загрузки фотографии на стену пользователя или сообщества.
    После успешной загрузки Вы можете сохранить фотографию, воспользовавшись методом photos.saveWallPhoto.
    Параметры:
    group_id идентификатор сообщества, на стену которого нужно загрузить фото (без знака «минус»).
    целое число
    Результат:
    После успешного выполнения возвращает объект с полями upload_url, album_id, user_id.
    Ответ написан
    7 комментариев
  • Посчитать количество файлов в сетевой папке. Написал программу, но она не видит путь до папки, что не так?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    ' \\slieshare\Reports\отчеты по "бугагашеньке"'
    • slieshare - не опечатка ли в slideshare
    • зачем пробел в начале перед двумя слэшами?
    • если не поможет перечисленное выше - поиграйтесь со шрифтами с экранированием пробелов и/или кавычек
    Ответ написан
    Комментировать
  • Python. Format. Как добавить нулей и выровнять?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    "{0:>10}".format("{0:>08b}".format(3))
    Для улучшения читабельности можно сделать так:
    binary_str = "{0:>08b}".format(3)
    aligned_str = "{0:>10}".format(binary_str)
    Ответ написан
    Комментировать
  • Почему не получается импортировать JSON?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    import json
    jsdata = '{"name": "Jack"}'
    data = json.loads(jsdata)
    print(data['name'])

    • Во-первых, ваш json невалиден. В JSON строже с кавычками, чем в python или php - там для обрамления строковых литералов разрешается использовать только двойные кавычки. Поэтому инвертируем кавычки во второй строчке
    • json.load - это метод загрузки из файла. Для парсинга из строки надо использовать json.loads
    • Последняя строчка - у вас неправильное обращение к ключу словаря
    Ответ написан
    Комментировать