【问题标题】:The name and nature of the "hidden" builtins classes object, function, code etc [closed]“隐藏”内置类对象、函数、代码等的名称和性质 [关闭]
【发布时间】: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/…

标签: python cpython


【解决方案1】:

也许作为推理的答案——afaik,这是关于不提供违背语义的公共 API。

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

如果您有动态构建某些东西的特定需求 - 请提供它们,通常有一个官方 API 可以做到这一点(例如ast

【讨论】:

  • 这是关于ast 的一个好点,并且没有搞砸语义。 NoneType 是最容易使用的,但即使 NoneType 工作正常,并且可以设想一个传递类的函数来实例化它,在所有其他情况下,让 NoneType 和 None 乱跑也是危险的。 (哦,是的,我通常使用 is 关键字,我在示例中使用相等,因为我想通过显示它们相等且相同来测试它是否仍然完全有效 - NoneNone.__class__() 的哈希是相同的高位数字)
猜你喜欢
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多