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
- 有没有一种方法可以在 Python 的类型注释语法中表达这种依赖性,而不是运行时检查或除了运行时检查之外?
- 这在其他编程语言中是否可行?
- 这个依赖概念是否有可以研究的名称和相关理论?
您的依赖项似乎是 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), 并为该参数对象创建一个工厂或构建器, 使要求明确。
这是一个强制其参数类型之间存在依赖关系的函数:
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
- 有没有一种方法可以在 Python 的类型注释语法中表达这种依赖性,而不是运行时检查或除了运行时检查之外?
- 这在其他编程语言中是否可行?
- 这个依赖概念是否有可以研究的名称和相关理论?
您的依赖项似乎是 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), 并为该参数对象创建一个工厂或构建器, 使要求明确。