Python 函数参数类型依赖

Python function parameter type dependencies

这是一个强制其参数类型之间存在依赖关系的函数:

def example(a: Optional[int], b: Optional[int]) -> int:
    if a is None and b is None:
        raise TypeError("One of a and b can be None, but not both.")
    return 42

您的依赖项似乎是 Design by contract 上下文中先决条件的一个示例 - 维基百科页面列出了多种编程语言,它们在不同程度上支持这一点。例如,在 Eiffel 中,为此目的用 require 限定函数。

虽然我相信 Python 没有将先决条件形式化的本地机制,但维基百科页面列出了一些库。从粗略的检查来看,这些似乎不像你的例子那样处理参数间的前提条件。 (有趣的是,从 2003 年开始有一个延迟的 PEP,它将通过文档字符串中的一个简单规范来实现这一点:https://www.python.org/dev/peps/pep-0316/

老实说,我不确定 @typing.overload 在这种情况下是否会有很大帮助,但我很想看看基于它的解决方案。

虽然对于您拼出的示例来说可能有点过分,但如果您有更多参数 and/or 它们之间更复杂的依赖关系,另一种方法可能是将参数封装在参数对象中(参见,例如, https://refactoring.com/catalog/introduceParameterObject.html), 并为该参数对象创建一个工厂或构建器, 使要求明确。