在python 3中,当type()返回除类之外的任何东西?

Bil*_*imi 4 python python-3.x

所以我正在浏览copy库的源代码,我发现了这个:

cls = type(x)

copier = _copy_dispatch.get(cls)
if copier:
    return copier(x)

try:
    issc = issubclass(cls, type)
except TypeError: # cls is not a class
    issc = False
Run Code Online (Sandbox Code Playgroud)

重要的是cls = type(x)except TypeError: # cls is not a class.(如果他们帮忙,我会在中间留下一行).该except条款使我相信,有一些x针对type(x)不会再回来一类,但我想不出一个例子,这将是的情况.(我尝试print在条款中添加一个语句,看看我是否可以触发它无效).你能给我一个type()不退还课程的例子吗?

aba*_*ert 9

如果你问的是办理登机手续copy.copy,那实际上没有必要.这是一个长期存在的错误,但这是一个无关紧要的问题,多年来没有人愿意修复.但巧合的是,它仅在11天前作为问题11572的一部分修复,这是一个伞形错误,旨在完成copy.py3.8模块的代码覆盖.

这里的根本原因可以追溯到Python 2.2中存在的一个真正的问题,直到2.x分支的某个地方(我猜到2.5,包括在内,但这是一个猜测) - 但修复程序直到3.4才添加,问题不复存在很久之后.


Python 2.x中不存在此检查.正如user2357112所追求的那样,它被添加为Python 3.4中问题11480的修复的一部分.copy.copy在具有自定义元类的类中破坏,并且需要修复,该修复是从中复制的copy.deepcopy,但包含了不再需要的更改.后来被删除deepcopy,但copy直到本月才坐下来.


由tripleee发现,最初的错误是#502085.

事实上,在2.2,它不仅可能issubclass(type(x), type)TypeError,它在野外实际发生的事情.

在Python 2.1和更早版本中(在PEP 252之前,扩展类型基本上可以在他们的类型槽中粘贴任何他们想要的东西.在2.2+中,这会破坏isinstanceissubclass.它们是为了提升TypeError而不是segfaulting,这已经足够了,因为谁是永远不会在类型插槽中粘贴非类型,对吧?原来的版本boost::python确实适合你.

下一个版本没有引起这个问题,大概不是每个人都立即升级(它需要重写代码的一部分,它不能生成与Python 2.1兼容的模块,以及2MB下载,认真吗?你认为我在224Kbps双ISDN还是其他什么东西?),所以这些异常是一件让人担心的事情.

(这只与老式和新式类相关 - 扩展类型实际上总是"新风格",甚至在此之前就已经存在了,我很确定在之前添加了对类型的检查3.0.)


虽然从技术上讲,我们就是这样,但class在Python文档中这个词是模棱两可的.有时a class是通过执行class语句或通过调用type构造函数(或调用其子类type)创建的.有时a classtype或者是子类的实例type,在这种情况下,内置类型类.

通过前一个定义,x = 1是一个type(x)不是类的例子.但是根据后一种定义,它是 - 而且显然是使用的定义issubclass.所以,这几乎是无关紧要的,除非你正在寻找一个惹恼别人的问题.

  • FWIW"SF 502085"似乎是指https://bugs.python.org/issue502085 ......也许这个bug跟踪器当时托管在Source Forge上? (2认同)