验证子类中的Python参数

时间:2009-01-28 18:31:43

标签: python inheritance decorator static-typing

我正在尝试验证一些python参数。在我们在Python 3.0中获得新的静态类型之前,最好的方法是什么。

这是我正在尝试的一个例子:

class A(object):
    @accepts(int, int, int)
    def __init__(a, b, c):
        pass

class B(A):
    @accepts(int, int, int, int)
    def __init__(a, b, c, d):
        A.__init__(a, b, c)

正如你所看到的那样,装饰器很好地对我的类的输入进行了类型检查,但是我必须定义第二个类的所有参数,当我有多个继承级别时它会非常讨厌。我可以使用kwargs取得一些成功,但它不如上面的类型检查方法那么好。

基本上我想从kwargs列表中弹出一个参数并检查它的类型,然后将余数传递给它的父级,但是这会以非常灵活和干净的方式执行此操作,因为这会缩放。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

为什么不定义any值,并用@accepts(any, any, any, int)修饰子类构造函数?您的装饰器不会检查标有any的参数,超类构造函数上的@accepts将检查子类传递给它的所有参数。

答案 1 :(得分:0)

您可能想要使用inspect模块。它将让您枚举超类,参数列表和其他有趣的东西。您似乎可能希望检查超类__init__方法的参数列表,并将其与子类中的内容进行比较。我不确定这是否适合你。

我会谨慎对待你做出的假设。假设仅仅因为A类具有<{1}}的 N 参数,子类将包含至少 N 参数并传递第一个,这可能是不安全的。 N 通过超类。如果子类更具体,那么它可能会填充其超类__init__方法的2个参数。