如何在python中隐式检查方法参数

时间:2015-06-04 11:04:28

标签: python methods arguments

我编写了一个库,该库使用用户定义的类,以自定义公式方式计算某些已定义的属性。稍后,此用户定义的公式将用于某些库函数中。公式具有通用参数的允许范围。因此,用户必须定义​​最小和最大允许参数值。在使用之前,检查允许的参数范围很重要。

以下代码显示了目前的工作方式。 用户必须使用类参数minmax以及set_all_attributes()方法编写子类。在这种方法中,他可以实现自定义代码,并且必须显式调用check_value_range()方法。这个子类需要一些样板代码,用户必须为许多自定义子类中的每一个编写代码。特别是check_value_range()方法的调用。

现在我的问题:是否有更好的方法来实施边界检查?是否有可能在元类的帮助下隐式调用检查?出于性能原因,只应对所有类属性执行一次检查。

from abc import ABCMeta, abstractmethod

class Base:
    __metaclass__ = ABCMeta

    def __init__(self, init_value=0):
        self.a = init_value
        self.b = init_value
        self.c = init_value

    def check_value_range(self, value):
        """make sure the value is in the permitted range"""
        if value < self.min or value > self.max:
            raise ValueError('value not in permitted range!')

    @abstractmethod
    def set_all_attributes(self, value):
        """force subclasses to override this method"""
        pass

class UserDefinedSubclass(Base):
    """user has to define the min and max class arguments 
    as well as the set_all_attributes() method"""
    min = 0
    max = 10

    def set_all_attributes(self, value):
        """the user has to explicitly call the
        check_value_range() method"""
        self.check_value_range(value)
        self.a = 1+2*value
        self.b = 2+5*value
        self.c = 3+4*value

def some_library_function(user_class):
    u = user_class()
    u.set_all_attributes(2)
    return u.a + u.b + u.c

# usage
print some_library_function(UserDefinedSubclass)

0 个答案:

没有答案