相关疑难解决方法(0)

如何使内置容器(集,字符串,列表)线程安全?

从这个问题中理解,如果我想拥有一个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)

python multithreading thread-safety

16
推荐指数
1
解决办法
8839
查看次数

将python装饰器应用于类中的方法

我有@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 decorator

15
推荐指数
2
解决办法
4582
查看次数

如何使用python unittest2仅在测试失败时执行代码?

我在python的unittest2框架中运行了一些基于类的单元测试.我们正在使用Selenium WebDriver,它有一个方便的save_screenshot()方法.我想抢到拆解()的截图为每个测试失败,以减少花在调试的时间,为什么一个测试失败.

但是,我找不到任何方法只在测试失败时运行代码.tearDown()无论测试是否成功,都会调用,我不想让我们的文件系统混乱,有数百个浏览器屏幕截图用于成功的测试.

你会怎么做?

python unit-testing selenium-webdriver

11
推荐指数
1
解决办法
1735
查看次数

包装调用Python类的方法

我想用相同的包装器在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)

python python-2.7

5
推荐指数
1
解决办法
2394
查看次数