如果 None 破坏了函数的逻辑,但我确实在函数体内检查它,我是否应该输入可选内容?

Sha*_*y87 3 python type-hinting python-typing

有时,在 Python 函数的开头,我会检查是否使用了正确的变量类型,或者是否将某些内容作为None. 例如:

def fails_with_none(x: int):
  if x is None:
    raise TypeError('Function fails with None!')
  return x + 1
Run Code Online (Sandbox Code Playgroud)

我正在犹豫是否x应该输入 asint或 as Optional[int]。使用 just 的原因int是,从语义上讲,该函数需要一个int. 但是,如果我从编程的角度考虑这一点,该函数会处理整数和None输入。

有推荐的方法吗?

例如,根据这个答案,提示Optional意味着“要么需要特定类型的对象,要么None需要”。

然而,问题仍然存在:什么需要?如果我们将其理解为“函数逻辑所需要的”,那么它应该被输入为int. 如果我们将其理解为“正在执行的代码需要”,那么由于我们检查了 是否x is None,因此它应该作为可能的类型提示包含在内。

che*_*ner 5

正是因为类型提示不会停止None在运行时传递,所以您应该使用int而不是Optional[int].

usingOptional[int]可以防止使用者mypy捕获静态类型错误,而 usingint不会影响任何使用静态类型检查器的人。

int两者都记录了您的意图,并提供了在运行代码之前捕获错误的能力。


一旦你这样做了,我认为你应该放弃显式实例检查。如果检查失败,则意味着调用者已经忽略了文档和潜在的静态类型检查器,并None无论如何都作为参数传递。在这一点上,保护他们免受None + 1后果的影响确实不再是你的工作了。