Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 11, 2009 04:24:28

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Lock

Привет всем.
На днях смотрел на IDE eggy… Она ещё очень сырая, но в ней на напоролся на файлик Decorators.py и прозрел! Декораторы, это, блин, хорошо и удобно!

Немного подумав и поговорив над концепцией с Shiz'ом, я склепал небольшой и удобный модуль для лока методов. Он не блещет особой функциональностью, но зато прост и интуитивно понятен.

class C(object):
@lock.name_1
def mtd_1_1(self):
pass

@lock.name_1
def mtd_1_2(self):
pass

@lock.name_2
def mtd_2(self):
pass
При первом обращении к любому методу lock (запрещены только начинающиеся и заканчивающиеся на “__”), создаётся и возвращается новый локер-декоратор. При последующих вызовах этого же локера, он же и возвращяется.
Удалить локер можно просто del lock.name_1. Правда всё, что залочено старым локом, так залоченным и останется, но я не уверен, что будет логично разлочивать, хотя и не трудно дописать такой функционал.

Залил сюда.
Если будете разбирать, обратите внимание на тесты. Они, в итоге, больше самого модуля, зато дают практически полное представление о функциональности объекта lock.
Само собой интересует критика.

P.S. Да, и помогите нормально заголовок оформить… А то читать ин-инглиш это ещё пол беды, а вот писать…



Отредактировано (Янв. 11, 2009 05:04:58)

Офлайн

#2 Янв. 12, 2009 14:00:22

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Lock

Занятно. Залил бы только на code.google.com чтоли, а то еще рапидшары здесь не хватало =)
Тесты можно было отдельным модулем, self.string = '' - в метод setUp запихнуть. Кстати, недавно перешел на nosetests - действительно намного удобнее, чем юниты.
Ну и -> This(The) module containS A simple lock decorator.



Офлайн

#3 Янв. 13, 2009 00:22:43

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Lock

Немного косметики и вот он, наверное, окончательный вариант.

ZAN
Залил бы только на code.google.com чтоли, а то еще рапидшары здесь не хватало
Ради такой мелочи создавать проект в гууглятине… ИМХО, это лишнее. А на zalil.ru пока особо рекламы нет, и работает как часы. При этом достаточно только файл укачать. Удобно.

ZAN
self.string = '' - в метод setUp запихнуть
Затупил… И это при том, что не курю!..

Клянул nose… Ничего не понял. Потом гляну ещё разок, но сейчас скажу, что у юнитов большой плюс – таскать с собой не надо, так как есть в коробке.



Офлайн

#4 Янв. 13, 2009 10:36:29

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Lock

Конечно, удобно-неудобно - это все субъективно, но мне в nose понравилось следующее:
- не нужно (хотя и можно) наследоваться от TestCase
- можно использовать assert
- тест генераторы

Типичный тест выглядит так:

from mymath.mymath import sqrt


def test_sqrt():
result = sqrt(4)
assert 2 == result, "2 was expected, got %s instead" %result
При этом иерархия катологов будет выглядеть так:
+mymath    <- корневой каталог
| __init__.py
|
+ mymath <- пакет, который в финале помещается в site-packages
| | __init__.py
|
+ +test_mymath <- пакет для тестирования
| | __init__.py
| | test_sqrt.py
запускается так:
alex@debian:~$ cd ~/Projects/mymath
alex@debian:~Projects/mymath$ nosetests
…………………..
———————————————————————-
Ran 23 tests in 0.098s

OK

То есть при обходе пакета nose автоматически добавляет его в path.
Удобство как раз в том, что при написании тестов избавляешься от необходимости делать всякие мелочи, которые всегда делать не хочеться =)

Сахарок напоследок:
from mymath.mymath import sqr


def test_sqr_generator():
"""test sqr function with different argments"""
invalues = [1, 2, 3, 4, 5, 6, 7]
outvalues = [1, 4, 9, 16, 25, 36, 49]
zipped = zip(invalue, out)
for i, o in zipped:
yield check_sqr, i, o

def check_sqr(invalue, etalon):
result = sqr(invalue)
assert result == out, "%s was expected for %s, got %s instead" %(result, invalue, etalon)
Будет запущено семь отдельных тестов.



Отредактировано (Янв. 13, 2009 11:33:36)

Офлайн

#5 Янв. 20, 2009 09:20:07

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Lock

Рассмотрел ближе. Спасибо за наводку, будем использовать.
Но всё-равно для тестирования маленьких модулей лучше использовать юниты прямо в самом модуле. Такое себе независимое самотестирование.



Отредактировано (Янв. 20, 2009 09:25:43)

Офлайн

#6 Янв. 20, 2009 10:41:05

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Lock

ZZZ
Но всё-равно для тестирования маленьких модулей лучше использовать юниты прямо в самом модуле. Такое себе независимое самотестирование.
Для маленьких модулей лучше всего - doctests



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#7 Янв. 21, 2009 23:43:41

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Lock

Угу. И как вы предлагаете его использовать в данном модуле?
Мне кажется, что doctests, это для для модулей типа def f(a, b): return a*b



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version