Найти - Пользователи
Полная версия: Lock
Начало » Python проекты » Lock
1
ZZZ
Привет всем.
На днях смотрел на 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. Да, и помогите нормально заголовок оформить… А то читать ин-инглиш это ещё пол беды, а вот писать…
ZAN
Занятно. Залил бы только на code.google.com чтоли, а то еще рапидшары здесь не хватало =)
Тесты можно было отдельным модулем, self.string = '' - в метод setUp запихнуть. Кстати, недавно перешел на nosetests - действительно намного удобнее, чем юниты.
Ну и -> This(The) module containS A simple lock decorator.
ZZZ
Немного косметики и вот он, наверное, окончательный вариант.

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

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

Клянул nose… Ничего не понял. Потом гляну ещё разок, но сейчас скажу, что у юнитов большой плюс – таскать с собой не надо, так как есть в коробке.
ZAN
Конечно, удобно-неудобно - это все субъективно, но мне в 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)
Будет запущено семь отдельных тестов.
ZZZ
Рассмотрел ближе. Спасибо за наводку, будем использовать.
Но всё-равно для тестирования маленьких модулей лучше использовать юниты прямо в самом модуле. Такое себе независимое самотестирование.
PooH
ZZZ
Но всё-равно для тестирования маленьких модулей лучше использовать юниты прямо в самом модуле. Такое себе независимое самотестирование.
Для маленьких модулей лучше всего - doctests
ZZZ
Угу. И как вы предлагаете его использовать в данном модуле?
Мне кажется, что doctests, это для для модулей типа def f(a, b): return a*b
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB