Ответы пользователя по тегу Python
  • RestFul на python,какой framework выбрать?

    @bromzh
    Drugs-driven development
    API - Flask (или Eve)
    Чат - торнадо
    Ответ написан
    Комментировать
  • Аналог composer'а для python?

    @bromzh
    Drugs-driven development
    Самое простое - хранить список в файле requirements.txt (имя может быть любым, но так принято):
    Flask==0.10.1
    Flask-Admin>=1.0.0

    Версии можно указывать разнообразные, в том числе, определённые коммиты/ветки/теги из систем контроля версий.
    Установить зависимости:
    pip install -r requirements.txt --upgrade
    в папке с этим файлом

    Ещё вариант описать зависимости в setup.py, но это больше для библиотек нужно.
    Ответ написан
    Комментировать
  • Как в python передать параметр как list of objects?

    @bromzh
    Drugs-driven development
    Ты звёздочку забыл
    table = GenTable('city', 100, *field_list)
    Ответ написан
    1 комментарий
  • Python3, целое от деления с отрицательным числом (с откидыванием остатка)?

    @bromzh
    Drugs-driven development
    68a123527a8f0a6de442d34885f282b6.png
    Вот формула деления с остатком. Да, остаток должен быть больше нуля, но в языках это не учитывается обычно.
    Ответ написан
  • Написание бота на Python 3.x?

    @bromzh
    Drugs-driven development
    Selenium же есть.

    PS Это уже 4-й или 5-й вопрос за последние 10 дней по этой теме. Когда уже люди научатся искать?
    Ответ написан
    Комментировать
  • Как реализовать имитацию веб пользователя?

    @bromzh
    Drugs-driven development
    Selenium же
    Ответ написан
    Комментировать
  • Как перенести крупное PHP приложение на Python?

    @bromzh
    Drugs-driven development
    Самое простое - взять Flask и SQLAlchemy. Прикрутить ОРМ джанги к готовой базе труднее, чем в SQL. Да и сам фласк не навязывает свои решения, он модульный. Нужна админка - ставь отдельно. Аутентификация тоже отдельно. ОРМ отдельно, и т.д.

    А инфы мало, потому что сам фреймворк маленький. В документации фласка всё есть. Для всяких расширений доже документации обычно хорошие. Мне обычно хватает инфы из доков.
    Ответ написан
    Комментировать
  • Cron vs Python deamon?

    @bromzh
    Drugs-driven development
    Можешь Celery использовать. Её и к фреймворкам прикрутить можно, запускать из веб-интерфейса. Есть ещё и панель для мониторинга. Хотя в простом случае лучше крон юзать.
    Ответ написан
  • Почему словарь как аттрибут не уникален?

    @bromzh
    Drugs-driven development
    Потому что надо литературу читать. Ты объявляешь классовую переменную. Она будет общей для всех экземпляров твоего класса. И используются они, например, для хранения информации, необходимой всем экземплярам.
    Ответ написан
  • Как сделать чат на tornado и motor?

    @bromzh
    Drugs-driven development
    В моторе апи почти такое же, как и в pymongo. Различия описаны тут. Неужели добавить в местах обращения к базе yield from так трудно?

    UPD. Извиняюсь, ошибочка вышла. yield from - это новый синтаксис для написания асинхронного кода, введённый в питон 3.3. В торнадо используется просто yield. Хотя использовать новый синтаксис в торнадо очень легко: вместо торнадовского декоратора @tornado.gen.coroutine следует оборачивать методы в декоратор @asyncio.coroutine, вместо yield писать yield from и надо настроить торнадовский IOLoop на новый IOLoop из модуля asyncio.

    Как правильно рендерить html
    Так же, как и всегда. Вся прелесть декоратора корутины и yield в том, что код выходит как будто написанный в привычном синхронном стиле. Просто передавай твой результат шаблону, при рендере этот результат-генератор "раскроется" во что нужно.
    Однако, я не уверен, что для чата надо использовать рендер шаблонов: по-хорошему надо отправлять сообщения через вебсокеты, на клиенте принимать их и рисовать сообщения яваскриптом.
    Ответ написан
  • Python: работа с MySQL?

    @bromzh
    Drugs-driven development
    На самом деле, SQLAlchemy делится на 2 части: работа с БД (то, что ты хочешь) и отдельно ОРМ (который, естественно, медленнее, чем работа напрямую с БД).
    Так вот, если не нужно ОРМ - не используй. Захочешь использовать модели - пожалуйста. При этом, тебе не потребуется менять библиотеки и переписывать весь код. Плюс, единообразие при работе с любыми БД.

    UPD
    Тут неправду пишут, что использование ОРМ всегда лучше. ОРМ всегда медленнее, нежели работа напрямую. Плюс, ты не всегда сможешь выразить на языке ОРМ то, что нужно.
    На хабре часто упоминается, что для простых ненагруженных вещей люди используют JPA ORM (это для java). Когда нагрузки возрастают, переходят на "прямые" запросы. Вот только фишка в том, что эти запросы обычно описываются в неком унифицированном виде (на неком специальном варианте SQL). Таким образом, и без использования ОРМ можно не привязываться к конкретной СУБД.
    Так вот алхимия как раз-таки позволяет использовать как унифицированный интерфейс для работы с БД без ОРМ (это sqlalchemy core), так и строить поверх него отображения на модели (sqlalchemy orm).
    Ответ написан
  • Какой фреймворк выбрать: Play! (java) или Flask (python)?

    @bromzh
    Drugs-driven development
    Когда твой проект на play в очередной раз будет компилироваться по полчаса, ты пожалеешь, что выбрал play.
    Ответ написан
    Комментировать
  • Создать демона на python 2.7 ?

    @bromzh
    Drugs-driven development
    Всегда использую supervisord. Просто отличная штука, ещё и на питоне написанная. Гибкие конфиги, перезапуск при падении. и другие плюшки.

    UPD
    Как использовать:
    1) Ставишь его общесистемно sudo apt-get install supervisor (можно и через пип поставить, но настраивать надо побольше будет).
    2) Надо настроить сам супервизор: откуда он будет брать конфиги, какие права нужны и т.д. Если у тебя убунта, то настройки самого супервизора будут в порядке. Они хранятся в /etc/supervisor/supervisord.conf. В этом файле прописано, что настройки для демонов будут читаться из папки /etc/supervisor/conf.d
    Если у тебя не убунта, или ты ставил супервизор через пип, то вот стандартный конфиг. Настройки там очевидные
    3) Когда супервизор поставлен и настроен, запускай его:
    sudo service supervisor start
    или
    sudo supervisord

    4) Теперь надо сделать конфиг для запуска твоего скрипта. Создаёшь файл в папке с конфигами такого содержания:
    [program:ОТОБРАЖАЕМОЕ_ИМЯ]
    command = КОМАНДА_ДЛЯ_ЗАПУСКА (например python ИМЯ_СКРИПТА)
    autorestart = true # автостарт при запуске супервизора
    stderr_logfile = /var/log/ИМЯ_ЛОГФАЙЛА.err.log # тут перенаправляем stderr в файл
    stdout_logfile = /dev/null # тут глушим весь вывод со stdout


    Всё! Управлять твоими демонами можно через команду supervisorctl. Сперва надо перепрочитать конфиг, потом стартануть приложение:
    supervisorctl reread
    supervisorctl ОТОБРАЖАЕМОЕ_ИМЯ start

    Можно опустить ОТОБРАЖАЕМОЕ_ИМЯ, тогда команда будет применена ко всем.
    Также ты можешь запустить CLI, если введёшь supervisorctl без параметров. Там по табу смотри команды.
    Читай этот раздел, для понимания конфигов запускаемых приложений.
    Ответ написан
    1 комментарий
  • Как в python 3.4 вернуть несколько значений из сопрограммы (корутины)?

    @bromzh Автор вопроса
    Drugs-driven development
    Ответ подсказали в другом месте. В общем, можно использовать для таких целей очередь:
    import random
    import asyncio
    
    @asyncio.coroutine
    def coro(que: asyncio.Queue):
        res = 0
    
        t = random.random() * 3
        yield from que.put('start 1')
        yield from asyncio.sleep(t)
        yield from que.put('value 1 = {}'.format(t))
        res += t
    
        t = random.random() * 3
        yield from que.put('start 2')
        yield from asyncio.sleep(t)
        yield from que.put('value 2 = {}'.format(t))
        res += t
    
        t = random.random() * 3
        yield from que.put('start 3')
        yield from asyncio.sleep(t)
        yield from que.put('value 3 = {}'.format(t))
        res += t
    
        yield from que.put(None)
        return res
    
    @asyncio.coroutine
    def run(que: asyncio.Queue):
        while True:
            res = yield from que.get()
            if res is None:
                break
            print(res)
    
    q = asyncio.Queue()
    asyncio.async(run(q))
    asyncio.async(coro(q))
    asyncio.get_event_loop().run_forever()
    Ответ написан
    Комментировать
  • Можно ли переопределять метод родителя с другим набором аргументов (Python 3)?

    @bromzh
    Drugs-driven development
    Если уж стоит такая острая необходимость, то используй *args и/или **kwargs в родителе:
    class A(object):
        def foo(self, *args, **kwargs):
            pass
    
    class B(A):
        def foo(self, a, b, c=42):
            pass
    Ответ написан
    1 комментарий
  • Как переписать код с PHP на Python?

    @bromzh
    Drugs-driven development
    Вот бы еще кто подсказал аналог phpDoc комментария "@property Bar1 bar1" для автокомплита в PyCharm.

    Docutils, Pycharm умеет её анализировать. Разметка там в нормальном RestructuredText. Плюс, есть отличная система документации Sphinx.
    Вот пример оформления docstring для функции:
    def public_fn_with_sphinxy_docstring(name, state=None):
        """This function does something.
    
        :param name: The name to use
        :type name: str
        :param state: Current state to be in
        :type state: bool
        :returns:  the return code
        :rtype: int
        :raises: AttributeError, KeyError
    
        """
        return 0

    Или, более компактно:
    def public_fn_with_sphinxy_docstring(name, state=None):
        """This function does something.
    
        :param str name: The name to use
        :param bool state: Current state to be in
        :returns:  int - the return code
        :raises: AttributeError, KeyError
        """
        return 0


    Кроме того, в 3-й ветке питона есть поддержка аннотаций типов (можно указывать тип аргументов функции и возвращаемый тип). Pycharm это тоже понимает.
    Ответ написан
    5 комментариев
  • Как изменить метод родительского класса в python?

    @bromzh
    Drugs-driven development
    class A(object):
        def __init__(self):
            self.a = []
    
    class B(A):
        def __init__(self):
            self.a = []
            super(B, self).__init__()

    Супер умеет искать во всех родительских классах, да и это сейчас рекомендуемый способ.
    Ответ написан
  • Практическая часть изучения ЯП и web технологий?

    @bromzh
    Drugs-driven development
    Сперва реши, какая часть тебе больше нравится - фронтенд или бэкенд. Знать придётся всё, но лучше углубиться в одно направление.
    Если выбрал первое - бери готовый сайт, попытайся сверстать так же, без особого подглядывания в исходники. Потом добавляй интерактив на страницу. Потом бери какой-нибудь mvvm-фреймворк на JS и сделай одностраничное приложение. Не забывай учиться, как взаимодействовать с серверной частью. Инструменты: препроцессоры для CSS - Less/SCSS, библиотеки для JS - jQuery, Knockout, Angular, etc.
    Если хочешь заниматься бэкендом на питоне - бери и изучай какой-нибудь фреймворк, для начала подойдёт Django. Сперва делай сайт, типа бложека, новостного или магазина. Потом добавляй всякие плюшки - пагинацию, RSS, затем делай REST API, переделай сайт, чтобы он мог подгружать данные без перезагрузки страниц. После этого изучи другой фреймворк , сделай тоже самое на нём. Потом изучай асинхронные штуки, прикрути к твоему сайту чатик. Инструменты - Django/Flask как обычные веб-фреймворки, Twisted/Tornado/asyncio для асинхронных штук. ZeroMQ (или другие MQ), Celery для общения между приложениями. Неплохо научиться работать с разными видами БД: как SQL, так и NoSQL.

    Но в реальной жизни хрен знает, что тебе пригодится для работы.
    Ответ написан
    Комментировать