我从这个问题中理解,如果我想拥有一个set线程安全的,我必须自己实现线程安全部分.
所以我想出来:
from threading import Lock
class LockedSet(set):
"""A set where add() and remove() are thread-safe"""
def __init__(self, *args, **kwargs):
# Create a lock
self._lock = Lock()
# Call the original __init__
super(LockedSet, self).__init__(*args, **kwargs)
def add(self, elem):
self._lock.acquire()
try:
super(LockedSet, self).add(elem)
finally:
self._lock.release()
def remove(self, elem):
self._lock.acquire()
try:
super(LockedSet, self).remove(elem)
finally:
self._lock.release()
Run Code Online (Sandbox Code Playgroud)
所以,当然只有add()和remove()在这个实现中是线程安全的.其他方法不是因为它们没有在子类中被覆盖.
现在,模式非常简单:获取锁定,调用原始方法,释放锁定.如果我遵循上面的逻辑,我将不得不以set基本相同的方式覆盖所有暴露的方法,例如:
(伪代码)
def <method>(<args>):
1. acquire lock
2. try:
3. call original method passing <args>
4. finally:
5. release lock …Run Code Online (Sandbox Code Playgroud) 我有@login_testuser针对方法test_1应用的装饰器:
class TestCase(object):
@login_testuser
def test_1(self):
print "test_1()"
Run Code Online (Sandbox Code Playgroud)
有没有办法可以应用test_1()前缀为"test_"的类的每个方法?
换句话说,装饰器将应用于 下面的test_1,test_2方法,但不适用于setUp.
class TestCase(object):
def setUp(self):
pass
def test_1(self):
print "test_1()"
def test_2(self):
print "test_2()"
Run Code Online (Sandbox Code Playgroud) 我在python的unittest2框架中运行了一些基于类的单元测试.我们正在使用Selenium WebDriver,它有一个方便的save_screenshot()方法.我想抢到拆解()的截图为每个测试失败,以减少花在调试的时间,为什么一个测试失败.
但是,我找不到任何方法只在测试失败时运行代码.tearDown()无论测试是否成功,都会调用,我不想让我们的文件系统混乱,有数百个浏览器屏幕截图用于成功的测试.
你会怎么做?
我想用相同的包装器在Python中包装许多类方法.
从概念上讲,它在最简单的场景中看起来像这样:
x = 0 # some arbitrary context
class Base(object):
def a(self):
print "a x: %s" % x
def b(self):
print "b x: %s" % x
class MixinWithX(Base):
"""Wrap"""
def a(self):
global x
x = 1
super(MixinWithX, self).a()
x = 0
def b(self):
global x
x = 1
super(MixinWithX, self).a()
x = 0
Run Code Online (Sandbox Code Playgroud)
当然,当有更多的方法a而且b,这变得一团糟.似乎应该有更简单的东西.显然x可以在装饰器中进行修改但是仍然有一个很长的垃圾列表,而不是上面的代码:
from functools import wraps
def withx(f):
@wraps(f) # good practice
def wrapped(*args, **kwargs):
global x
x = 1
f(*args, …Run Code Online (Sandbox Code Playgroud)