/ 不支持的操作数类型:'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__