/ 不支持的操作数类型:'Primitive' 和 'list'
unsupported operand type(s) for /: 'Primitive' and 'list'
我正在将一个项目(最初不是我的)从 python2
转换为 python3
。
在我的一个脚本中:
sk = (key.Sub[0]/["point", ["_CM"]]).value
这适用于 py2
, 但不适用于 py3
,这会引发错误:
unsupported operand type(s) for /: 'Primitive' and 'list'
除了错误,我还对原始语法感到困惑obj/list
。
你们能在这里点灯吗?
这是由于 Python 2 和 3 之间除法运算符的不同行为。
PS C:\Users\TigerhawkT3> py -2
Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class A:
... def __div__(self, other):
... return 'call div'
... def __truediv__(self, other):
... return 'call truediv'
... def __floordiv__(self, other):
... return 'call floordiv'
...
>>> a = A()
>>> a/3
'call div'
>>> a//3
'call floordiv'
>>> exit()
PS C:\Users\TigerhawkT3> py
Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class A:
... def __div__(self, other):
... return 'call div'
... def __truediv__(self, other):
... return 'call truediv'
... def __floordiv__(self, other):
... return 'call floordiv'
...
>>> a = A()
>>> a/3
'call truediv'
>>> a//3
'call floordiv'
您需要为 Python 定义 __truediv__
特殊方法,而不是 __div__
3。有关详细信息,请参阅 Python 2 and Python 3 的数据模型。
很可能 Primitive
实现 __div__
允许它被另一个对象(在本例中为列表)“划分”。在 Python 2 中,操作 x / y
将使用 x.__div__(y)
如果它存在(如果不存在,则 y.__rdiv__(x)
.
在 Python 3 中,此行为已 更改 。要实现 /
除法运算符,您需要实现 __truediv__
。这解释了您观察到的差异。
据推测,您可以访问 Primitive
的来源。只需将其 __div__
方法修补为 __truediv__
我正在将一个项目(最初不是我的)从 python2
转换为 python3
。
在我的一个脚本中:
sk = (key.Sub[0]/["point", ["_CM"]]).value
这适用于 py2
, 但不适用于 py3
,这会引发错误:
unsupported operand type(s) for /: 'Primitive' and 'list'
除了错误,我还对原始语法感到困惑obj/list
。
你们能在这里点灯吗?
这是由于 Python 2 和 3 之间除法运算符的不同行为。
PS C:\Users\TigerhawkT3> py -2
Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class A:
... def __div__(self, other):
... return 'call div'
... def __truediv__(self, other):
... return 'call truediv'
... def __floordiv__(self, other):
... return 'call floordiv'
...
>>> a = A()
>>> a/3
'call div'
>>> a//3
'call floordiv'
>>> exit()
PS C:\Users\TigerhawkT3> py
Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class A:
... def __div__(self, other):
... return 'call div'
... def __truediv__(self, other):
... return 'call truediv'
... def __floordiv__(self, other):
... return 'call floordiv'
...
>>> a = A()
>>> a/3
'call truediv'
>>> a//3
'call floordiv'
您需要为 Python 定义 __truediv__
特殊方法,而不是 __div__
3。有关详细信息,请参阅 Python 2 and Python 3 的数据模型。
很可能 Primitive
实现 __div__
允许它被另一个对象(在本例中为列表)“划分”。在 Python 2 中,操作 x / y
将使用 x.__div__(y)
如果它存在(如果不存在,则 y.__rdiv__(x)
.
在 Python 3 中,此行为已 更改 。要实现 /
除法运算符,您需要实现 __truediv__
。这解释了您观察到的差异。
据推测,您可以访问 Primitive
的来源。只需将其 __div__
方法修补为 __truediv__