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

    @bromzh
    Drugs-driven development
    Инди на unreal? Как-то сурово. Возьми лучше https://love2d.org/ В качестве языка там lua, он очень лёгок для изучения.
    Ответ написан
  • Как правильно организовать многопоточное консольное приложение на python?

    @bromzh
    Drugs-driven development
    Не надо писать многопоточные программы на питоне, потому что GIL.
    Если нужна хорошая многопоточность - Java в руки.
    Ответ написан
  • Серверные языки - как не запутаться и что изучить?

    @bromzh
    Drugs-driven development
    Выбор сильно зависит от конечной цели, бэкенд очень многогранен. Java будет хорошим выбором в большинстве областей. Но её долго учить. И даже после основ самого языка придётся изучать инструменты, которые используются в той или иной области. Зато вакансии всегда есть и они обычно более высокооплачиваемые.
    Да и вообще, это очень востребованный язык, который используется в самых разных областях (и не только на бэкенде). Ну и java который год на первом-втором месте по популярности и сдавать позиции особо не намерен.
    Если хочется что-то по-быстрому, то питон вполне подойдёт.
    Ответ написан
    Комментировать
  • Как выбрать открытый проект на Python для поддержки?

    @bromzh
    Drugs-driven development
    1) Выбираешь проект (для начала небольшой), которым пользуешься сам.
    2) Смотришь список issues
    3) Выбираешь ту, которую сможешь сделать сам (для начала лучше поправить небольшую багу)
    4) Форкаешь проект
    5) Реализуешь issue
    6) Гоняешь тесты
    7) Если всё ок, делаешь пулл-реквест автору
    8) Повторить

    Ну и главное, надо следовать общему стилю всего проекта и про pep-8 помнить.
    Ответ написан
    Комментировать
  • Есть ли какие-то IDE с web интерфейсом для работы с python?

    @bromzh
    Drugs-driven development
    https://codenvy.com/
    Там много языков, питон тоже есть. Сейчас это одна из лучших IDE в облаке.
    Ответ написан
  • Какой фреймворк выбрать для интернет-магазина?

    @bromzh
    Drugs-driven development
    Бери angular (первый). Для связи с REST API бери restangular или стандартный сервис $http.
    Я сам бэкенд пишу на питоне и яве. На фронте ангуляр.
    Ответ написан
    8 комментариев
  • Как в TornadoWeb (Python3) обрабатывать присланные картинки?

    @bromzh
    Drugs-driven development
    Уменьшай на клиенте, например. www.jqueryrain.com/demo/jquery-crop-image-plugin
    Ну а вообще, торнадо же асинхронный, просто делай обработчик асинхронным. Для этого достаточно обернуть обработчик в декоратор, чтобы сделать из него корутину. Причём подойдёт декоратор из питона 3.4. И скорее всего даже новый синтаксис async/await тоже заработает, если настроить торнадо на IOLoop из asyncio (который входит в библиотеку для питонов >= 3.4 ).

    www.tornadoweb.org/en/stable/guide/coroutines.html
    Там пример кода есть. Вот нужно строку response = await http_client.fetch(url) заменить на обрезку файла. Чтобы заработало асинхронно, нужно сделать обрезку файла в виде корутины.
    Ответ написан
  • Как изучаем Python?

    @bromzh
    Drugs-driven development
    www.diveintopython3.net
    Погружайся
    Ответ написан
    Комментировать
  • Как в наследнике переопределить свойство?

    @bromzh
    Drugs-driven development
    попробуй объявить поле action в родительском классе:
    class Father(models.Model):
        COST = 100
        content = models.TextField(max_length=COST)
        action = models.BooleanField(default=False)
    
        class Meta:
            abstract = True
    
        def save(self, *args, **kwargs):
            if self.COST > 200:
                self.action = True
            super(Father, self).save(*args, **kwargs)
    
    class Children(Father):
        COST = 500
    Ответ написан
    Комментировать
  • Пожайлуста дайте советы по улучшению программного кода?

    @bromzh
    Drugs-driven development
    Фигнёй ты страдаешь. Сперва изучи работу со строками и числами, списки, кортежи, множества, словари, итераторы и генераторы. Потом функции поизучай, как они в питоне определяются и вызываются, как передавать аргументы, зачем нужны одинарные и двойные звёздочки в параметрах функции. Потом изучай ООП, какое оно в питоне, чем отличается от других реализаций. Зачем и когда вообще нужны классы, а когда нет. Потом всякие фишки питоновские касательно классов, что такое классовая переменная, метод класса, статический метод, property. Потом можно изучить декораторы и другие функциональные штуки питона. Заодно поймёшь, что это за лямбды у тебя в коде, что такое замыкание и контексты видимости переменных. Потом изучай стандартную библиотеку: работу с датами, с json, с сетью, файлами и сокетами, асинхронный ввод-вывод (надеюсь ты 3-ю ветку изучаешь).
    Попутно вызубри pep8. Ну и всё это естественно на практических примерах. Примеры есть на всяких codeacademy и других подобных сайтах.
    Потом можешь выбирать направление и изучать библиотеки и фреймворки, которые люди часто используют. Если это, например, веб - то это django, tornado и пр.

    А бездумное копирование кода с видео. который ты сам не понимаешь и простыни довольно однотипного кода tkinter не помогут тебе в изучении этого прекрасного языка.
    Ответ написан
    1 комментарий
  • Как не ждать окончания вызова функции в Python?

    @bromzh
    Drugs-driven development
    https://docs.python.org/3/library/threading.html
    Только учти, что у питона есть глобальная блокировка, и такое распараллеливание будет весьма условным.
    А вообще, всё зависит от задачи. Если ты пишешь что-то сетевое, то лучше взять tornado/asyncio или celery
    Ответ написан
    Комментировать
  • Есть способ открыть JPEG через Python 3 без сторонних модулей?

    @bromzh
    Drugs-driven development
    Конечно есть. На вики ищи описание формата jpeg, открывай файл в бинарном режиме, считывай побайтово, сохраняй данные о точках в списках. Короче, делай всю ту работу, что уже сделали до тебя создатели PIL/Pillow и libjpeg. Кстати, jpeg не такой простой формат, как например bmp или tiff, тут возни побольше будет.
    Ответ написан
    Комментировать
  • Какие существуют специализации на python'е?

    @bromzh
    Drugs-driven development
    Питон часто используют для математических вычислений: www.scipy.org
    Это обёртки для фортрановских библиотек + всякие удобные плюшки для построения графиков, символьных вычислений и т.д. Но сам понимаешь. вакансий таких крайне мало, т.к. очень узкая специфика.
    Ещё используют как скриптовой язык во всяких движках. Но тут надо смотреть вакансии именно по движкам.
    Ещё для обработки всяких данных можно использовать. У яндекса есть вакансии связанные с этим, там используется питон. Но опять же, узкая специфика, конкретных вакансий мало.
    Администрирование/написание скриптов - тоже специфичная вещь и искать надо вакансии сисадмина.

    Всё-таки веб, в виде джанго или других серверов, в т.ч. асинхронных (tornado/asyncio) - более распространённая сфера, для которой можно найти вакансии. Для других же они достаточно редки.
    Но это совсем не значит, что на питоне мало пишут.
    Ответ написан
    2 комментария
  • Python и web-разработка, с чего начать?

    @bromzh
    Drugs-driven development
    Читай документацию по джанге, тем более она есть и на русском. Примеры сайтов там тоже есть.
    Флакс проще как фреймворк, но на нём сложнее писать: надо самому организовывать структуру проекта, выбирать как хранить данные (SQL/NoSQL БД, файлы, ещё что-то), самому организовывать аутентификацию и т.д. Фласк гибче, но большие приложения на нём требуют бОльших знаний.
    А для джанги есть куча готовых решений, начинать лучше с неё
    Ответ написан
    Комментировать
  • Как реализовать исключение при неправильном состоянии класа?

    @bromzh
    Drugs-driven development
    просто опиши твой декоратор вне класса и создай сам враппер с нужной сигнатурой (первым агрументом поставь self). что-то типа такого:
    from functool import wraps
    
    def decorator(func):
        @wraps(func)
        def wrapper(self, *args, **kwargs):
            if self.whatever == "something":
                raise Exception()
            return func(self, *args, **kwargs)
        return wrapper
    Ответ написан
  • SyntaxError: Non-ASCII character как исправить?

    @bromzh
    Drugs-driven development
    # -*- coding: utf-8 -*-

    Эта строка указывает, что кодировка исходника - UTF-8. В этом файле у тебя всё правильно, компилятор ругается на другой файл (/home/vitali/projects/mysite/blog/admin.py). Вставь в начало всех файлов проекта эту строку.

    НО, если я уберу таб в последней строке,

    Зачем? Ты понимаешь, что делаешь? Или это рандом?
    Вообще, компилятор же всё ведь написал, научись понимать, что написано.
    Ответ написан
    3 комментария
  • Передача списка в объект класса по ссылке, как сделать?

    @bromzh
    Drugs-driven development
    Автор, ты несёшь бред. Ты прочитал статью, но ничего из неё не понял. Вот тебе доки, просвящайся.
    Давай ещё на русском продублирую, раз с английским туго
    1) Когда ты присваиваешь одну переменную другой, на самом деле происходит лишь копирование ссылок на объект. В итоге, 2 переменные ссылаются на 1 объект. Вот тебе простейшее доказательство, если ты мне не веришь. Пожалуйста, вбей этот текст в интерпретатор питона и убедись сам:
    class A(object):
        def __init__(self, item):
            self.field = item
    
    c = [1, 2]
    a = A(c)
    id(a.field) == id(c) # => True. Где тут разные id, покажи? 
    c[0] = 100
    a.field # => [100, 2] Копия создаётся, говоришь? Как ты тогда объяснишь, что изменяли мы c, а a.field вдруг тоже изменилось?
    a.field[1] = 200
    c #=> [100, 200] Ты всё ещё уверен, что это копия?


    Автор в статье как раз и пытается донести мысль, что переменная - это не сам объект (объект хранится в памяти), а только лишь его адрес. И когда ты пишешь знак равенства, на деле переменной слева всего лишь присваивается тот адрес, на который указывает переменная справа. После присваивания 2 переменные стали ссылаться на 1 объект в памяти.
    Если этот объект неизменяемый (строка, кортеж, число, и т.д.), то ты никак его изменить не сможешь. И когда ты переменной, указывающей на этот объект присваиваешь новое значение, на деле, переменная просто начинает указывать на другой объект, а тот который был до этого не меняется. Даже когда пишешь i += 1, i будет указывать уже на другой объект
    Если же переменная указывает на мутабельный объект (экземпляр класса, список, словарь и т.д.), то над ней можно совершить некие действия, который изменят состояние объекта. И это изменённое состояние и будут отображать другие переменные, которые ссылаются на этот объект. Таким образом, можно изменить 1 переменную, а изменения прочитать из другой.

    2) В питоне нет понятия "объявить переменную". Сам факт присваивания переменной чего-нибудь либо затирает старую ссылку (но не объект!) на объект, либо создаёт новую связь.
    Так вот, есть такое понятие, как область видимости. Если ты создашь новую переменную внутри функции, извне она будет не видна. А вот если ты возьмёшь в качестве имени внутренней переменной уже использовавшееся ранее, то эта внутренняя переменная затенит внешнюю. Внутри функции не будет доступа к внешней переменной с тем же именем, вместо неё будет внутренняя.

    Так вот автор (и доки) так и говорят: если ты внутри функции попытаешься присвоить переменной с именем одного из аргумента какое-то новое значение, то это значение будет локальным внутри данной функции, а извне её значение переменной, которую передали в качестве аргумента будет старым. Более того, даже если ты сперва присвоил внутренней переменной внешнюю, но потом ещё раз присвоишь что-то другой, то во внутренней будет другая ссылка. Поясняю:
    def foo(a):
        print(id(a))
        a = [1] # Теперь a затеняет внешнюю переменную, т.е. указывает на другой объект
        print(id(a))
    
    b = [0, 1]
    foo(b) # Id будут разные, хотя имя одно, но после присвоения переменная потеряла связь с внешней


    И вот пока ты внутренней переменной не присвоил что-то новое, изменяя её ты изменишь и внешнюю переменную.
    И после "смерти" объекта ничего не изменится, как ты писал. Объект удаляется из памяти не сразу, это делает сборщик мусора, и только в том случае, если ссылок на объект в программе нет. Но тогда ты и не сможешь своё значение получить.

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

    @bromzh
    Drugs-driven development
    Если нужен именно путь, то используй, как уже сказали, os.path.join, желательно всегда.
    Если просто вставить значение переменной(ых) в строку, то используй интерполяцию. Есть 2 варианта: со знаком процента или через метод format:
    a = 1
    b = 'foo'
    c = [1, 2, 3]
    
    s1 = 'string with vars: %s %s %s' % (a, b, c)
    s2 = 'string with vars: {} {} {}'.format(a, b, c)
    s2 = 'string with vars: {2} {0} {1}'.format(a, b, c)
    s2 = 'string with vars: {foo} {bar} {qux}'.format(foo=a, qux=b, bar=c)
    Ответ написан
    Комментировать
  • Какое api и имплементация должны быть для REST коллекций в python?

    @bromzh
    Drugs-driven development
    Но что если пользователь хочет исключить поля в коллекции уровнем ниже
    Используй точку, потом рассматривай включаемые/исключаемые поля рекурсивно.
    Ответ написан
  • Автоматическая закачка файла?

    @bromzh
    Drugs-driven development
    Если у тебя линукс или что-то похожее, то достаточно обычного баша:
    #!/bin/sh
    now="$(date +'%Y-%m-%d')"
    url="http://example.com/$now/$now.mp4"
    wget -c -P /папка/куда/сохранять/ $url

    И засунуть это в ежедневный крон.

    Опции wget посмотри, там куча разных штук, типа повтора при ошибке, выкачивании каталога/всего сайта, и т.д.
    Ответ написан
    Комментировать