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
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