作者:天涯s1_278 | 来源:互联网 | 2022-12-10 05:23
所以我正在浏览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
重要的是cls = type(x)
和except TypeError: # cls is not a class
.(如果他们帮忙,我会在中间留下一行).该except
条款使我相信,有一些x
针对type(x)
不会再回来一类,但我想不出一个例子,这将是的情况.(我尝试print
在条款中添加一个语句,看看我是否可以触发它无效).你能给我一个type()
不退还课程的例子吗?
1> abarnert..:
如果你问的是办理登机手续copy.copy
,那实际上没有必要.这是一个长期存在的错误,但这是一个无关紧要的问题,多年来没有人愿意修复.但巧合的是,它仅在11天前作为问题11572的一部分修复,这是一个伞形错误,旨在完成copy.py
3.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+中,这会破坏isinstance
和issubclass
.它们是为了提升TypeError
而不是segfaulting,这已经足够了,因为谁是永远不会在类型插槽中粘贴非类型,对吧?原来的版本boost::python
确实适合你.
下一个版本没有引起这个问题,大概不是每个人都立即升级(它需要重写代码的一部分,它不能生成与Python 2.1兼容的模块,以及2MB下载,认真吗?你认为我在224Kbps双ISDN还是其他什么东西?),所以这些异常是一件让人担心的事情.
(这只与老式和新式类相关 - 扩展类型实际上总是"新风格",甚至在此之前就已经存在了,我很确定在之前添加了对类型的检查3.0.)
虽然从技术上讲,我们就是这样,但class
在Python文档中这个词是模棱两可的.有时a class
是通过执行class
语句或通过调用type
构造函数(或调用其子类type
)创建的.有时a class
是type
或者是子类的实例type
,在这种情况下,内置类型是类.
通过前一个定义,x = 1
是一个type(x)
不是类的例子.但是根据后一种定义,它是 - 而且显然是使用的定义issubclass
.所以,这几乎是无关紧要的,除非你正在寻找一个惹恼别人的问题.
FWIW"SF 502085"似乎是指https://bugs.python.org/issue502085 ......也许这个bug跟踪器当时托管在Source Forge上?