通过修饰器注入类属性



我有一大堆 Django TestCases,它们使用 setUp 方法来初始化一些在众多测试中使用的属性,它们的构造方式和相互依赖的方式是逻辑我想移出测试用例并重用

def setUp(self):
self.property_1 = ##some logic
...

我想将它们重写为一些方便的包装器,可以通过简单的继承或装饰器注入到类中,例如

@with_property_1(x=1, y=2)
def setUp(self):
...

def with_property_1(**model_kwargs):
def wrapper(f):
def wrapped(*args, **kwargs):
self = args[0]
self.property_1 = ## logic
f(*args, **kwargs)
return wrapped
return wrapper

但问题是 PyCharm 无法识别这些实例属性的存在,因为 TestCase 类内部没有任何内容会设置它们。有没有另一种方法可以很好地实现这一点,或者有一种方法可以哄骗 PyCharm 认识到这些属性是合法的,因为装饰器的存在?

免责声明:这是未经测试的。

这里的问题是 Python 不能只是神奇地将self放入装饰器的上下文中(这在任何 IDE 中都不起作用)。您可能忘记了,self是调用时传递给每个类方法的参数之一。因此,它存在于您的*args中,您可以操纵它。

这是我的试用代码:

def with_property_1(**model_kwargs):
def wrapper(f):
def wrapped(*args, **kwargs):
for key, value in model_kwargs.items():
setattr(args[0], key, value)
f(*args, **kwargs)
return wrapped
return wrapper

解释:

  1. 遍历**model_kwargs中的每个键/值。

  2. 使用setattr修改args[0],这应该是self变量,其中包含提供的 kwarg。

  3. 使用更新的self变量正常调用函数。

相关内容

  • 没有找到相关文章

最新更新