如何解决“隐藏”内置类对象、函数、代码等的名称和性质
我对模块 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 原因?
如果只是为了阻止命名空间污染,我会在内置模块中说或在某个模块中使用下划线对象......除非它们在其他地方
问:可以从其他地方直接导入吗?!
解决方法
也许是对推理的回答——afaik,这是关于不提供违背语义的公共 API。
即实例化 NoneType
是您不应该做的事情,就像对 None
进行相等比较一样。
如果您有动态构建某些东西的特定需求 - 请提供它们,通常有一个官方 API 可以这样做(例如,ast
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。