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



我对模块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__

魔术方法的traceback是相同的:

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

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

问:这些"隐藏"的名字是什么?装入的类?

我知道内置是用C在CPython中编写的。我快速浏览了一下CPython Github的repo,我不明白为什么不像tuple,它们是"隐藏的"。我用了"类"这个词;因为它们有相同的魔法方法等,并且像其他类一样工作:

NoneType() == None  # True as expected
bytecode = code(...)  #  bytecode...
fxn = function(bytecode)

问:他们不在大楼里的原因是什么?

如果只是为了阻止命名空间污染,我认为它们应该是内置模块中的下划线对象,或者在某些模块中…除非它们在别的地方

问:它们能从其他地方直接进口吗?

可能是对推理的回答——错了,这是关于不提供违背语义的公共API。

。实例化NoneType是你不应该做的事情,就像对None进行相等性比较一样。

如果你有特定的需求来动态构建一些东西-请提供它们,通常有一个官方的API来做这件事(ast,作为一个例子)

最新更新