ChatGPT解决这个技术问题 Extra ChatGPT

在 python 3.x 中,通常使用函数的返回类型注解,例如:

def foo() -> str:
    return "bar"

“void”类型的正确注释是什么?

我正在考虑 3 个选项:

def foo() -> None:不符合逻辑 IMO,因为 None 不是类型, def foo() -> type(None):使用我知道的最佳语法来获取 NoneType,def foo():省略显式返回类型信息.

选项 2. 对我来说似乎是最合乎逻辑的,但我已经看到了 1 的一些实例。

FWIW,Python 没有返回类型为 void 的函数。任何没有显式 return 的函数(或函数中的分支)都将返回 None。我假设 OP 明白,这个评论主要是为了未来读者的利益......
好吧,这个问题不像“为什么我的函数在 Python 中返回 None?”那么受欢迎。 (我提出了这个问题),所以可能大多数读者已经知道默认行为。 1 vs 2的困境在答案中得到解决。但是3呢?对于“程序”,我实际上更喜欢选项 3,没有无用的混乱(毕竟,这个函数不返回任何东西)。
@TomaszGandor 同意。当函数或方法不包含 return 语句时,无需指定其返回类型。
确实,仅使用 None 进行类型提示似乎不合逻辑,因为它不是一种类型,除非知道在内部 None 被解释为 type(None),即 NoneType

A
AKS

这直接来自 PEP 484 -- Type Hints 文档:

在类型提示中使用时,表达式 None 被认为等同于 type(None)。

而且,如您所见,大多数示例都使用 None 作为返回类型。


为了澄清,请选择上面的选项 1。
@asmaier 根据引用 PEP 484 — Type Hints NoReturn 类型的 this question 使用“......注释永远不会正常返回的函数。例如,无条件引发异常的函数......”
补充一点——有一个类 NoneType 与 None 不同。 (无!= 类型(无))。如果您正在检查带有 -> None 输入提示的函数的返回类型。你想检查是否 typing.get_type_hints(func)['return'] == type(None)
A
Alex Waygood

TLDR:void 返回类型注释的惯用等效项是 -> None

def foo() -> None:
    ...

这与没有 return 或仅包含 return 的函数的计算结果为 None 相匹配。

def void_func():  # unannotated void function
    pass

print(void_func())  # None

省略返回类型 not 表示没有返回值。根据 PEP 484

对于检查函数,参数和返回类型的默认注释是 Any。

这意味着该值被视为动态类型和静态 supports any operation。这实际上是 void 的相反含义。

Python 中的类型提示并不严格要求实际类型。例如,注释可以使用类型名称的字符串:Union[str, int]Union[str, 'int']'Union[str, int]' 和各种变体是等效的。

类似地,类型注释 None 被认为意味着“属于 NoneType”。这可以用于其他情况以及返回类型,尽管您最常将其视为返回类型注释:

bar : None

def foo(baz: None) -> None:
    return None

这也适用于泛型类型。例如,您可以在 Generator[int, None, None] 中使用 None 来指示生成器不接受或不返回值。

即使 PEP 484 建议 None 表示 type(None),您不应该明确地使用后一种形式。类型提示规范包含任何形式的 type(...)。这在技术上是一个运行时表达式,它的支持完全取决于类型检查器。 mypy 项目对于 type(None)considering whether to remove support,并且也将其从 484 中删除。

或者我们应该更新 PEP 484 以不建议 type(None) 作为类型有效,并且 None 是唯一正确的拼写?应该有一种——最好只有一种——明显的方法等等。——JukkaL,2018 年 5 月 18 日