Python2 至 Python3 次升级

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:\temp\athenapkgs\ext3py27-232140\noarch\pylib\site-packages\six.py", line 703, in reraise
    raise value
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'int' and 'MagicMock'

PYTHON 2 示例

>>> import mock
>>> import six
>>> six.PY2
True
>>> x=mock.MagicMock()
>>> y = min(x,2)
>>> y
2
>>> 

显示了两个示例,我需要使 Py3 不 return 错误 - 有什么问题吗?

我四处寻找内置函数的工作原理。我认为这与 python 2 的最小内置函数从魔法模拟中调用 __int__ 有关,但与 python 3 无关。我认为这是因为调用 mock.MagicMock().__int__()每个 REPL 版本 returns 一个整数 1.

这与__int__无关,因为__int__不涉及两种情况。 mock.MagicMock() 在任何一种情况下都无法与 int 相提并论(由于 __int__ 过载,您可以 将其强制 int,但它不是 int,并且看起来不像 int)。

唯一对 built-ins 比较对象重要的特殊方法是丰富的比较运算符 __lt__/__gt__(在某些情况下 Python 2,__le__/__ge____cmp__,虽然后者在 Py3 中被完全弃用和删除),虽然 MagicMock 在技术上实现了它们,但它立即实现它们 return NotImplemented (这相当于在大多数情况下根本不定义它们),Python 解释器将其解释为“我不知道如何将自己与其他事物进行比较,请问其他事物是否知道如何进行比较本身到 me"; int 当然不知道如何将自己与 MagicMock 进行比较并说同样的话,这就是我们得到 Python 2 和 3 之间差异的地方。

在 Python 3 上,当两种类型都缺少 __lt__/__gt__ 或两者都缺少时 return NotImplemented、Python 3将其转换为 TypeError(因为类型实际上是无法比较的,这是正确的做法)。

在 Python 2 上,它仍然“有效”(对于“有效”的糟糕定义),因为 Python 2 对 < 和公司;如果类型不兼容(缺少 __lt__/__gt__ 或者它们 returned NotImplemented 当在任一方向调用时), it would use a "default order comparison (<, >, <=, and >=) [that] gives a consistent but arbitrary order." 比较是(除其他外) ) 基于所涉及类型的字符串化名称,与它们的 无关(无论您将什么 int 值与 MagicMock 进行比较,MagicMock总是会比较相同)。我会注意到,在我的 Python 2 解释器上,MagicMock 总是由 min(x, ANY_INT_HERE) 产生,它永远不会产生 int 值,所以我无法重现你的内容在 Python 上看到 2.

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

y = min(int(x), 2)

所以它在 Python.

的所有版本上都是实际的 int