Python2 to Python3 upgrades



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),它将使用"默认顺序比较(<,>,<=和>=)[这]给出了一致但任意的顺序。 比较(除其他外)基于所涉及的类型的字符串化名称,与它们的值无关(无论您将什么intMagicMock进行比较,MagicMock总是会比较相同)。我会注意到,在我的 Python 2 解释器上,MagicMock总是由min(x, ANY_INT_HERE)生成,它永远不会产生int值,所以我无法重现你在 Python 2 上看到的内容。

如果您希望MagicMock表现为int,请在使用时强制使用它,例如:

y = min(int(x), 2)

所以这是所有版本的 Python 的实际int

最新更新