如何给予type(None)一个名字,或者在任何python3 subversion中使用NoneType?

idfiyjo8  于 2023-06-07  发布在  Python
关注(0)|答案(1)|浏览(135)

我正在做某种Python3代码生成,我希望生成强类型代码,但我发现用NoneType很难处理。
当我手头有一个类型引用时,我可能想在某些情况下在类型注解中生成它的表示代码,也可能想在其他情况下在运行时代码中生成它的表示代码作为类型引用。但它并不一致,在第一种情况下,我需要在类似f: int -> None的上下文中生成类似None的代码,但在第二种情况下,我必须在类似ty = type(None)的上下文中生成类似type(None)的代码,我希望使用NoneType使其一致。
我发现在Python3的一些早期的subversion中存在types.NoneType,但后来被删除了,在Python3.10中又被添加了回来。因此,有许多Python3子版本没有从types导出NoneType
Where is the NoneType located?
那么,有没有什么方法可以定义一个NoneType的backport,这样我就可以一致地使用它,并尽可能地与Python3 subversion兼容。

vptzau2j

vptzau2j1#

这是我的解决方案:

from typing_extensions import Protocol, TypeAlias

NoneType: TypeAlias = Literal[None]

我发现这在运行时的Python3.8上工作得很好(意味着不会抛出异常),并且在pyright/pylance上也工作得很好(意味着在静态分析时可以正确识别)。
由于Literal是在pep 586中的Python3.8中引入的,因此它在Python3.9或更高版本中也应该可以正常工作。由于typing_extensions也导出Literal,所以这在Python3.7甚至更早的版本上都是可行的。

相关问题