Становимся опытным пользователем pdb

Что такое pdb?

pdb - модуль из стандартной библиотеки python, который позволяет:

  • пошагово выполнять инструкции из исходного кода
  • устанавливать условные точки останова (breakpoints)
  • исследовать стек вызовов (трассировка стеков, stack trace)
  • просматривать исходный код
  • исполнять python-код в контексте выполняемой программы
  • выполнять исследование аварийно завершившейся программы (постотладка)

Read more...

Регистрация пакета на PyPi

Для того, чтобы python-проект можно было устанавливать при помощи pip и распространять через хранилище пакетов pypi, он должен иметь определенную структуру и содержать ключевые для установки файлы.

Классическим считается следующее расположение файлов:

root-dir/   # рабочая папка с проектом
      setup.py
      setup.cfg
      LICENSE.txt
      README.md
      mypackage/
        __init__.py
        foo.py
        bar.py
        baz.py

Read more...

Создание docker-окружения для Django проекта

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

О преимуществах и недостатках такого подхода к разработке и развертыванию уже написано много статей, не вижу смысла повторяться. Сосредоточимся сразу на основной теме статьи: создание docker-окружения для разработки и запуска web-проекта, написанного на python. В качестве примера буду использовать мой последний проект на Django, но все написанное ниже на 95% подойдет к любому другому web-фреймворку на python, будь то Twisted, Flask или что-либо еще.

Read more...

Makefile в python-проектах

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

helloword: helloword.c
    gcc -o hellword hellword.c -I.

После этого, выполнив из командной строки

$ make helloword

можно запустить компиляцию C-кода при помощи gcc.

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

Read more...

Python 3 - Введение в asyncio

Модуль asyncio был добавлен в основную библиотеку python в версии 3.4 в качестве временного пакета. Это означает, что в ходе обновлений модуль может получить изменения, несвместимые с предыдущими версиями, или, возможно, вообще будет удален из базовой библиотеки. Из документации следует, что asyncio "предоставляет инфраструктуру для написания однопоточного конкурентного кода при помощи сопрограмм (corutines), мультиплексирования ввода/вывода данных через сокеты и другие ресурсы, запуска сетевых клиентов и серверов, и другие подобные примитивы". Эта статья не ставит цели описать всё, что можно сделать при помощи asyncio, однако из неё можно понять, как использовать этот модуль и чем он может быть полезен.

Если вам нужен пакет с функционалом asyncio в более старых версиях python, обратите внимание на Twisted или gevent.

Read more...

Аннотации типов в python

Одним из наиболее обсуждаемых нововведений в python 3.5 стали аннотации (рекомендации) типов - type hints. Для полного понимания вопроса, я бы рекомендовал ознакомиться с PEP 483 и PEP 484, а так же посмотреть эту презентацию Гвидо. В двух словах: аннотации типов буквально означают указание типа используемых объектов.

В связи с динамической природой python, определение и проверка типа используемого объекта представляет собой достаточно большую сложность. Из-за этого разработчикам бывает сложно понять, что делает написанный кем-то другим код, и, что самое важное, ограничивается функционал инструментов проверки типов во многих средах разработки (первое, что приходит в голову - PyCharm и PyDev) из-за отсутствия какого-либо индикатора типа объектов. Как результат - IDE правильно определяет тип объекта примерно в 50% случаев.

Read more...

Добавляем уникальное (unique) поле к существующей модели в Django

Добавление нового уникального поля к существующей модели Django (при условии, что оно не может быть пустым) не самая простая задача. В чем проблема? Представим, что мы создаем миграцию, в которой добавляем уникальное поле, скажем, uuid. Наша модель после изменений выглядит так:

import uuid
from django.db import models

class MyUUIDModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    # остальные поля

Создаем миграцию при помощи makemigrations и пробуем её применить. Что получается?

Read more...

Как получить всех пользователей в группе в Django

Существует несколько способов получить всех пользователей, состоящих в определенной группе в Django.

Во-первых, в py-файле проекта необходимо импортировать классы User и Groups из django.countrib.auth (предполагается, что auth уже включено в INSTALLED_APPS в настройках, иначе что бы вы тут делали?)

from django.contrib.auth.models import User, Group

Read more...

Фильтры для Django Queryset

Для того, чтобы отфильтровать объекты, у которых определенные поля имеют значение None используется фильтр is_null:

MyModel.objects.filter(some_field__isnull=True)

 

Read more...