"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
,例如)
我很好奇 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
,例如)