用于测试所需类变量的装饰器类

2024-06-16 09:22:10 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我不知道这是不是正确的方法。我想编写一个decorator类,它将与其他类的方法一起使用。在运行该方法之前,我想检查是否所有必需的类变量都已初始化。理想的情况是这样的:

class Test(object):
    def __init__(self, f):
        self.f = f
        # some magic

    def __call__(self):
        self.f.magically_get_variable(required)
        # do some checks and execute method or throw an exception

class Data(object):
    def __init__(self, a, b):
        self.a = a

    @test
    def sum(self):
        required('self.a', 'self.b')
        return self.a + self.b

如果这不是应该这样做,请告诉我如何正确地做。在


Tags: 方法testselfobjectinitdefmagicrequired
2条回答

如果您坚持在装饰方法的主体开始之前检查,以下是一种合理的方法…:

import functools

class test(object):
    def __init__(self, requiredvars):
        self.reqs = requiredvars.split()

    def __call__(self, f):
        @functools.wraps(f)
        def wrapper(wself, *a, **k):
          missing = set()
          for v in self.reqs:
            if not hasattr(wself, v):
              missing.add(v)
          if missing:
            msg = 'missing fields: %s' % ','.join(sorted(missing))
            raise valueerror, msg
          return f(wself, *a, **k)
        return wrapper

class data(object):
    def __init__(self, a, b):
        self.a = a

    @test('a b')
    def sum(self):
        return self.a + self.b

d = data(23, 42)
d.sum()

正如你所希望的那样

^{pr2}$

我认为decorator在这里有点不适合用来检查变量是否存在。在

想一想如果没有提供所需的变量,您将要做什么:引发一个异常(它在您的注释中)。在

我会说(根据上面的代码):

def sum(self):
    return self.a + self.b

如果self.a或self.b没有提供,让它失败(它将引发一个NameError异常,如果您愿意,您可以捕获它,如果您想的话,您可以自己引发它。)

相关问题 更多 >