【问题标题】:Validating Python Arguments in Subclasses验证子类中的 Python 参数
【发布时间】:2026-01-14 21:50:01
【问题描述】:

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

有什么建议吗?

【问题讨论】:

    标签: python inheritance decorator static-typing


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】: