我正在将一个项目(最初不是我的)从python2
转换为python3
。
在以下其中一种脚本中:
sk = (key.Sub[0]/["point", ["_CM"]]).value
这适用于py2
,但不适用于 py3
,这会引发错误:
unsupported operand type(s) for /: 'Primitive' and 'list'
除了错误,我还对原始语法obj/list
感到困惑。
你们能在这里开灯吗?
答案 0 :(得分:2)
这是由于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 3,您需要定义__truediv__
而不是__div__
的特殊方法。有关更多信息,请参见Python 2和Python 3的数据模型。
答案 1 :(得分:2)
很可能Primitive
实现了__div__
,从而允许它被另一个对象(在这种情况下为列表)“划分”。在Python 2中,操作x / y
将使用x.__div__(y)
(如果存在)(如果不存在,则使用y.__rdiv__(x)
。
在Python 3中,此行为已已更改。要实现/
除法运算符,您需要实现__truediv__
。这解释了您正在观察的差异。
大概您可以访问Primitive
的源。只需将其__div__
方法修补为__truediv__