0

我正在尝试验证一些 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 列表中弹出一个参数并检查它的类型,然后将其余部分传递给它的父级,但是随着规模的扩大,以一种非常灵活和干净的方式执行此操作。

有什么建议么?

4

2 回答 2

1

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

于 2009-01-28T19:32:30.813 回答
0

您可能想玩转该inspect模块。它会让你枚举超类、参数列表和其他有趣的东西。似乎您可能想要检查超类__init__方法的参数列表并将其与子类中的参数列表进行比较。我不确定这是否对你有用。

不过,我会小心你所做的假设。假设仅仅因为类 A 有N个参数__init__,子类将至少包含N个参数并将第一个N传递给超类,这可能是不安全的。如果子类更具体,那么它可能会用 2 个参数填充其超类__init__方法的所有参数。

于 2009-01-28T19:17:18.613 回答