微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

“隐藏”内置类对象、函数、代码等的名称和性质

如何解决“隐藏”内置类对象、函数、代码等的名称和性质

我对模块 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 举报,一经查实,本站将立刻删除。