我正在尝试验证一些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列表中弹出一个参数并检查它的类型,然后将余数传递给它的父级,但是这会以非常灵活和干净的方式执行此操作,因为这会缩放。
有什么建议吗?
答案 0 :(得分:1)
为什么不定义any
值,并用@accepts(any, any, any, int)
修饰子类构造函数?您的装饰器不会检查标有any
的参数,超类构造函数上的@accepts
将检查子类传递给它的所有参数。
答案 1 :(得分:0)
您可能想要使用inspect
模块。它将让您枚举超类,参数列表和其他有趣的东西。您似乎可能希望检查超类__init__
方法的参数列表,并将其与子类中的内容进行比较。我不确定这是否适合你。
我会谨慎对待你做出的假设。假设仅仅因为A类具有<{1}}的 N 参数,子类将包含至少 N 参数并传递第一个,这可能是不安全的。 N 通过超类。如果子类更具体,那么它可能会填充其超类__init__
方法的2个参数。