/不支持的操作数类型:“原始”和“列表”

时间:2018-12-01 23:03:18

标签: python python-3.x python-2.x

我正在将一个项目(最初不是我的)从python2转换为python3
在以下其中一种脚本中:

sk = (key.Sub[0]/["point", ["_CM"]]).value

这适用于py2但不适用于 py3,这会引发错误:

unsupported operand type(s) for /: 'Primitive' and 'list'  

除了错误,我还对原始语法obj/list感到困惑。
你们能在这里开灯吗?

2 个答案:

答案 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 2Python 3的数据模型。

答案 1 :(得分:2)

很可能Primitive实现了__div__,从而允许它被另一个对象(在这种情况下为列表)“划分”。在Python 2中,操作x / y将使用x.__div__(y)(如果存在)(如果不存在,则使用y.__rdiv__(x)

在Python 3中,此行为已已更改。要实现/除法运算符,您需要实现__truediv__。这解释了您正在观察的差异。

大概您可以访问Primitive的源。只需将其__div__方法修补为__truediv__