"hidden" 内置 类 对象、函数、代码等的名称和性质

The name and nature of the "hidden" builtins classes object, function, code etc

我很好奇 class 存在于模块 builtins 中的那些不能直接访问的东西。比如

 type(lambda: 0) # __name__='function' of __module__='builtins'
 type((lambda: 0).__code__) # __name__='code' (aka. bytecode) of __module__='builtins'
 None.__class__  # __name__='NoneType' of __module__='builtins'

还有女族长:

str.__mro__[1] #  # __name__='object' of `__module__` 'builtins'

传递给上下文管理器的 __exit__ 魔术方法的回溯是相同的:

 def __exit__(self, exc_type: Exception, exc_value: str, exc_traceback: 'bultins.traceback'):
      pass

(模块 traceback 是一个模块,只是共享名称,tracemalloc.Traceback 也是如此)。在上面,对象名称是一个字符串,但这是一个罕见的“隐藏”内置 class 和类型提示的示例,因为对于 function 个实例,typing.Callable 完成了工作。

问:这些“隐藏”的内置 classes 的名称是什么?

我知道内置函数是用 CPython 中的 C 语言编写的。我快速浏览了 CPython Github 存储库,但我不明白为什么不像 tuple 它们是“隐藏的”。我使用“classes”这个词是因为它们具有相同的魔术方法等,并且像其他 classes:

一样工作
 NoneType() == None  # True as expected
 bytecode = code(...)  #  bytecode...
 fxn = function(bytecode)

问: 是否有 PEP 原因说明它们不在内置函数中?

如果只是为了停止名称空间污染,我会在内置模块 say 或某些模块中使用带下划线的对象...除非它们在其他地方

问:可以直接从别的地方导入吗?!

也许作为推理的答案 – afaik,这是关于不提供 public API 违背语义的。

即实例化 NoneType 是您不应该做的事情,就像对 None.

进行相等比较一样

如果您有特定的动态构建需求 – 请提供它们,通常会有官方 API 这样做(ast,例如)