Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python3中,type()何时可以返回类以外的任何内容?_Python_Python 3.x - Fatal编程技术网

在Python3中,type()何时可以返回类以外的任何内容?

在Python3中,type()何时可以返回类以外的任何内容?,python,python-3.x,Python,Python 3.x,因此,我正在浏览复制库的源代码,我发现: 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)和,TypeError除外:#cls不是一个类。(我在两行中间留下了,以防

因此,我正在浏览
复制
库的源代码,我发现:

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)
,TypeError除外:#cls不是一个类
。(我在两行中间留下了,以防他们帮忙)。
except
子句使我相信有一些
x
type(x)
不会返回一个类,但是我想不出一个这样的例子。(我尝试在子句中添加一个
print
语句,看看是否可以触发它,但没有效果)。你能给我一个例子,说明
type()
不返回类吗?

如果你问的是签入
copy.copy
,那实际上是没有必要的。这是一个由来已久的bug,但是一个微不足道的bug,多年来没有人费心去修复它。但是,巧合的是,它是一个伞形bug的一部分,该bug旨在完成3.8版的
copy.py
模块的代码覆盖

这里的根本原因可以追溯到Python2.2中存在的一个实际问题,直到2.x分支中的某个地方(我猜测直到2.5,包括2.5,但这只是一个猜测)——但直到3.4,在问题不再存在很久之后才添加修复


Python2.x中不存在此检查。正如用户2357112所发现的,它是作为Python3.4中的修复程序的一部分添加的
copy.copy
在一个具有自定义元类的类上被破坏,需要进行修复,该修复是从
copy.deepcopy
复制的,但包含了一个不再需要的更改。它后来从
deepcopy
中删除,但一直保留在
copy
中,直到本月


正如tripleee发现的,原来的bug是

事实上,在2.2中,不仅有可能让
issubclass(type(x),type)
引发
TypeError
,实际上这是在野外发生的

在Python2.1及更早版本中(以前,扩展类型基本上可以在其类型槽中粘贴他们想要的任何内容。在2.2+中,这将打破
isinstance
issubclass
。它们被要求提出
TypeError
,而不是分段错误,这已经足够好了,因为谁会在类型槽中粘贴非类型,对吗?好吧,原版最后版本的
boost::python
正好为您做到了这一点

下一个版本并没有引起这个问题,可能不是每个人都立即升级(它需要重写部分代码,它不能生成与Python 2.1兼容的模块,也不能下载2MB,说真的?你认为我使用的是224Kbps双ISDN还是什么的?),所以这些异常在一段时间内确实值得担心

(这仅仅与旧的和新的风格的类有着切身的联系,扩展类型实际上一直都是“新风格”的,甚至在这之前也是如此,而且我很确定在3.0之前添加了对其类型是否为类型的检查。)


从技术上讲,
class
这个词在Python文档中是不明确的。有时
class
是通过执行
class
语句或调用
type
构造函数(或调用
type
的子类)创建的。有时
类型
的实例或
类型
的子类,在这种情况下,内置类型是类


根据前面的定义,
x=1
类型(x)的示例
不是一个类。但根据后一种定义,它是一个类,这显然是所使用的定义。因此,这基本上是无关的,除非你想找一个让人恼火的问题。

。因此,一切的类型都是一个类。即使看到导致此更改的类型和引入此代码的类型,它仍然没有意义在Python2上,
type(x)
不会返回
classobj
x.\uu class\uuuu
会这样做,但是
type(x)
会返回
types.InstanceType
用于旧样式的实例。@user2357112不,它会返回
types.InstanceType
(又称
instance
)对于一个类的实例,但是对于一个类来说,
classobj
(又称
types.ClassType
)。同样,对于一个实例来说,
x.\uu class\uuuuuuu
是类本身,而不是
classobj
(并且
x.\uu class\uuuuuuuuu
对于一个类来说只是一个属性错误)。我想我们得到的是
classobj
和“a
classobj
”你的答案是“在Python2.x中,type(x)可能返回的类是
classobj
,而不是
type
”正如我所读到的,这意味着
type
可能会返回一个旧式类。它不会返回;对于旧式类的实例,
type
将返回
类型。InstanceType
而不是它们的旧式类。这就是我试图与我之前的注释交流的内容。FWIW“SF 502085”似乎是指…可能这个bug追踪器当时托管在SourceForge上?