PYTHON 3 示例
>>> import six
>>> six.PY3
True
>>> import mock
>>> x = mock.MagicMock()
>>> y = min(x,2)
Traceback (most recent call last):
File "C:tempathenapkgsext3py27-232140noarchpylibsite-packagessix.py", line 703, in reraise
raise value
File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'int' and 'MagicMock'
蟒蛇 2 示例
>>> import mock
>>> import six
>>> six.PY2
True
>>> x=mock.MagicMock()
>>> y = min(x,2)
>>> y
2
>>>
显示两个示例,我需要使 Py3 不返回错误 - 出了什么问题?
我四处乱窜,试图找出内置函数的工作原理。我认为这与 python 2 的最小内置函数从魔术模拟中调用__int__
有关,但不是 python 3。我假设这是因为在每个 REPL 版本上调用mock.MagicMock().__int__()
会返回一个整数 1。
这与__int__
无关,因为__int__
不参与这两种情况。 在任何一种情况下,mock.MagicMock()
都无法与int
相提并论(由于__int__
过载,您可以强制它int
,但它不是int
,看起来不像一个int
)。
对于内置比较对象唯一重要的特殊方法是丰富的比较运算符__lt__
/__gt__
(在某些情况下在 Python 2 上,__le__
/__ge__
或__cmp__
,尽管后者在 Py3 中被完全弃用并删除),虽然MagicMock
技术上实现了它们,但它实现它们立即return NotImplemented
(这相当于在大多数情况下根本不定义它们), Python 解释器将其解释为"我不知道如何将自己与另一件事进行比较,问问另一件事是否知道如何将自己与我进行比较";int
当然不知道如何将自己与MagicMock
进行比较,并说同样的话,这就是我们得到Python 2和3之间的区别的地方。
在 Python 3上,当两种类型都缺少__lt__
/__gt__
或者它们都返回NotImplemented
时,Python 3 将其转换为TypeError
(因为这些类型实际上是无与伦比的,这是正确的做法)。
不过,在 Python 2 上,它仍然"有效"(对于"作品"的糟糕定义),因为 Python 2 对<
和公司有一个构思不佳的后备比较;如果类型不兼容(缺少__lt__
/__gt__
,或者它们在任一方向调用时返回NotImplemented
),它将使用"默认顺序比较(<,>,<=和>=)[这]给出了一致但任意的顺序。 比较(除其他外)基于所涉及的类型的字符串化名称,与它们的值无关(无论您将什么int
值与MagicMock
进行比较,MagicMock
总是会比较相同)。我会注意到,在我的 Python 2 解释器上,MagicMock
总是由min(x, ANY_INT_HERE)
生成,它永远不会产生int
值,所以我无法重现你在 Python 2 上看到的内容。
如果您希望MagicMock
表现为int
,请在使用时强制使用它,例如:
y = min(int(x), 2)
所以这是所有版本的 Python 的实际int
。