为什么Python使用None类型提示而不是NoneType?

4
Python的None对象,类型提示使用None代替其实际类型NoneType。根据文档

请注意,None作为类型提示是一个特殊情况,会被替换为type(None)。

我认为这很令人困惑,没有进一步的解释。

有人知道背后的原因吗?

1个回答

3

这只是一种设计选择,没有特别的原因。

写成 def fn(x: None) -> Nonedef fn(x: NoneType) -> NoneType 更加简洁(而且在我看来也更清晰)。

这也与其他类型提示保持一致:ListDict等都是一个单词(与相关的内置函数相同),并带有首字母大写的单词。


2
我接受了你的答案,但我不同意你对这个设计选择的评估。List和Dict显然是类型,但None既是值又是类型,这让我感到不舒服。使用NoneType会更清晰明了。 - Beau B.
@BeauBarker 我认为他们很可能想要与其他类型提示保持一致。None是唯一一个已经具有大写字母的对象。 - Marco Bonelli
@BeauBarker -- 如果有帮助的话,PEP 484确实允许您在类型中有限地使用值。例如,Union[Literal["r"], Literal["w"]]是一个类型,表示相应的值只能是字符串"r"或"w" -- 这个类型之所以没有拼写成 Union["r", "w"] 是因为只要前向引用存在,这将太模糊了。但是这种不确定性不存在于None中,因此直接引用该值是可以的。由于type(None)只有一种值(例如,它是一种"singleton"类型),因此将type(None)None视为可互换的也是可以的。 - Michael0x2a
虽然这个理由有些事后才提出的感觉:文字类型/基本依赖类型只是在一年前添加的,并且比原始PEP 484规范晚了很多。但是它有助于使None看起来不那么特殊:例如,您可以将其视为仅仅是一个值,而不是同时是值和类型--在一些受限制的情况下混合值和类型是可以的。 - Michael0x2a
但是你不能写成 -> type(None),那很奇怪而且不一致。 - luochen1990

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接