воскресенье, 9 июля 2017 г.

Сравнить величину с двумя значениями

В python обычную операцию сравнения значения с двумя числами можно сделать красивее.


Задача
Есть переменная a. Напишите метод, который возвращает True, если значение a больше 0 и меньше 100. Иначе метод должен возвращать False.

Решение 1:
def is_in_interval(a):
    return (0 < a) and (a < 100)

В python это сравнение можно сделать элегантнее:

Решение 2:
def is_in_interval(a):
    return 0 < a < 100

TypeError __init__() takes 1 positional argument but 2 were given


В приложении на Django можно столкнуться с ошибкой при попытке просмотреть страницу:
TypeError at /1/results/ __init__() takes 1 positional argument but 2 were given

Причины могут быть разными, но если вы используете generic представления - ListView, DetailView, то проверьте, не забыли ли вы в urls.py добавить .as_view() к названию представления.

Файл представления polls/views.py:
# ...

class ResultsView(generic.DetailView):
    model = Question
    template_name = 'polls/results.html'


Файл polls/urls.py:
from django.conf.urls import url

from . import views

app_name = 'polls'

urlpatterns = [
    # /polls/123/results
    url(r'^(?P[0-9]+)/results/$', views.ResultsView.as_view(), name='results'),
    # ...
]

Если в этом файле вместо views.ResultsView.as_view() написать просто views.ResultsView, то возникнет ошибка: __init__() takes 1 positional argument but 2 were given

понедельник, 21 сентября 2015 г.

Python: как извлечь содержимое html-тега

В этом уроке мы посмотрим, как в Python можно извлечь содержимое тега html-страницы.

Сделаем мы это при помощи регулярого выражения с использованием метода re.findall:
import re
html = '''
<html>
  <head>
    <title>Page</title>
  </head>
  <body>
    <h1>Hello</h1>
    <p>Nice to see you!</p>
  </body>
</html>
'''

re.findall(r'<body.*?>(.*)</body>', text, re.DOTALL)
# Результат: ['\n<h1>Hello</h1>\n<p>Nice to see you!</p>\n']

Флаг re.DOTALL говорит Python-у, что под символом "." в регулярном выражении нужно подразумевать любой символ, включая перенос строки. Без этого флага Python будет считать, что под символом "." подразумевается все, кроме переноса строки.

 

пятница, 5 декабря 2014 г.

PGQ очередь с одним consumer и producer

Установим pgq:
$ sudo pip install pgqueue

Установим pgq-расширение для PostgreSQL:
$ sudo apt-get install postgresql-9.2-pgq3

После этого нужно через консоль подсоединиться к БД и выполнить команду на создание расширения pgq:
my_db=# CREATE EXTENSION IF NOT EXISTS pgq;

Теперь нужно запустить процесс ticker. Если это не сделать, то события будут добавляться в очередь, но не будут отправляться консьюмерам, что приведет к быстрому росту очереди.

Запустим простую питоновскую реализацию ticker:
python -m pgqueue 'host=127.0.0.1 port=5432 user=postgres password=123 dbname=johny'

Создадим скрипт consumer.py:
# encoding: utf-8
import psycopg2
import pgqueue

conn = psycopg2.connect("dbname=johny user=postgres password=123 host=localhost")
conn.autocommit = True
cursor = conn.cursor()

consum_q = pgqueue.Consumer('first_queue', 'consumer_one')
consum_q.register(cursor)

# Получаем события из очереди
conn.autocommit = False
for event in consum_q.next_events(cursor, commit=True):
    print(event)


При запуске этого скрипта события буду забираться из очереди. Но там пока нет событий. Чтобы они там появились, создадим файл publisher.py:
# encoding: utf-8
import psycopg2
import pgqueue

conn = psycopg2.connect("dbname=johny user=postgres password=123 host=localhost")
conn.autocommit = True
cursor = conn.cursor()

# Инициируем очередь
first_q = pgqueue.Queue('first_queue')
first_q.create(cursor, ticker_max_lag='4 seconds')

# Добавляем события в очередь
first_q.insert_event(cursor, 'greeting', 'How are you?')
first_q.insert_event(cursor, 'question', 'What are you doing?')

Чтобы события появились в очереди, запустим скрипт publisher.py:
$ python publisher.py

Теперь попробуем прочитать эти события из очереди, запустив consumer.py:
$ python consumer.py  

Если ответ не пришел, нужно убедиться, что процесс ticker запущен.

вторник, 25 ноября 2014 г.

Дизассемблировать python-программу

Порой бывает интересно, что происходит "под капотом" вашей программы. В python есть замечательный модуль dis, который позволяет посмотреть, как интерпретатор выполняет ваш код.

Создадим файл app.py:
import dis

n = 0

def application(env, start_response):
    global n
    n = n + 1
    response = "%.6d" % n
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return [response]

if '__main__' == __name__:
    print(dis.dis(application))
А теперь в терминале запустите этот файл:
$ python app.py

Программа выведет следующее:
           0 LOAD_GLOBAL              0 (n)
              3 LOAD_CONST               1 (1)
              6 BINARY_ADD         
              7 STORE_GLOBAL             0 (n)

           10 LOAD_CONST               2 ('%.6d')
             13 LOAD_GLOBAL              0 (n)
             16 BINARY_MODULO      
             17 STORE_FAST               2 (response)

 10          20 LOAD_FAST                1 (start_response)
             23 LOAD_CONST               3 ('200 OK')
             26 LOAD_CONST               6 (('Content-Type', 'text/plain'))
             29 BUILD_LIST               1
             32 CALL_FUNCTION            2
             35 POP_TOP            

 11          36 LOAD_FAST                2 (response)
             39 BUILD_LIST               1
             42 RETURN_VALUE       

Слева приведены строки нашей программы. Здесь видно, что операция инкремента переменной n (строка 7) занимает 4 операции.

четверг, 2 октября 2014 г.

Сделать на Django приложение бронирования времени приема

Как вы помните, фреймворк Django предназначен для быстрой разработки (Rapid Development). Следовательно, он поможет быстро решить следующую задачу.

Пролог
В компании ООО "Позитив", имеющей филиалы в нескольких городах России, возникла необходимость организовать 35 тысяч встреч со своими клиентами по вопросу оформления документов. Очевидно, что если все клиенты придут в первый день, то у специалистов компании "Позитив" будет в душе негатив. Кроме того, клиенты будут недовольны, ибо никто не любит терять время в километровых очередях.

Набросок технического задания
Нужно на Django создать сайт, где клиенты смогут указать свои данные и забронировать свободное время в удобный для них день.
Данные, требующиеся от клиента, которые должны быть отображены пользователю при бронировании времени:
  • ФИО
  • телефон
  • наименование организации
  • ИНН
  • Город, где удобно прийти на встречу
  • Адрес офиса, где будет проходить встреча
  • Дата встречи
  • Время встречи
При этом следует учесть ряд моментов:
  • организация не может забронировать более одной встречи
  • в списке дат и времени занятые значения должны отображаться серым цветом
Интерфейс придумайте самостоятельно. Защита "от дурака" (капча, невозможность создать более одной заявки с одного IP, валидация значений) не обязательна, ибо задание учебное.

Свои готовые решения можете публиковать ссылкой на проект github в комментариях к данной статье.

вторник, 3 июня 2014 г.

Запрограммируем сайт на Django

В сети нашел отличный сайт с видеоуроками по Bitrix. Там рассказывается, как на базе этой системы запрограммировать сайт. Сразу возникло желание сделать эту же работу на фреймворке Django.
Предлагаю Вам скачать шаблон сайта и запрограммировать его на Django. Гарантирую, вы многому научитесь.
Свою реализацию программирования сайта thesame я опубликовал на github.