【发布时间】:2021-02-04 12:50:43
【问题描述】:
我很好奇模块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 同上)。在上面,对象名称是一个字符串,但这是一个罕见的“隐藏”内置类和类型提示示例,因为对于 function 实例,typing.Callable 可以完成这项工作。
问:这些“隐藏”的内置类的名称是什么?
我知道内置函数是在 CPython 中用 C 语言编写的。我快速浏览了 CPython Github 存储库,但我不明白为什么不像 tuple 它们是“隐藏的”。我使用“类”这个词,因为它们具有相同的魔法方法等,并且像其他类一样工作:
NoneType() == None # True as expected
bytecode = code(...) # bytecode...
fxn = function(bytecode)
问:是否有 PEP 原因导致它们不在内置程序中?
如果只是为了阻止命名空间污染,我会认为它们会在内置模块或某些模块中被下划线对象...除非它们在其他地方
问:可以直接从其他地方导入吗?!
【问题讨论】:
-
我只是想了解它们是什么,将来可能会对我有所帮助。这个哲学问题是由类型提示回溯提示的,丑陋的
exc_traceback: 'bultins.traceback'就是这样做的。所以我没有具体的问题...... -
几天前,我遇到了一个可爱的例子,其中寻找这些“隐藏”的内置插件:stackoverflow.com/questions/8294618/…