неподдерживаемые типы операндов для /: «Примитив» и «Список» - PullRequest
0 голосов
/ 02 декабря 2018

Я конвертирую проект (изначально не мой) из python2 в python3.
В одном из скриптов я:

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

Это работает на py2, но не на py3, что выдает ошибку:

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

Помимо ошибки, я также запутался в исходном синтаксисе obj/list.
Можетвы, ребята, здесь проливаете свет?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Вероятно, что Primitive реализует __div__, позволяя ему «делиться» другим объектом (список в данном случае).В Python 2 операция x / y будет использовать x.__div__(y), если она существует (а если нет, то y.__rdiv__(x).

В Python 3 это поведение изменило . Для реализации/ оператор деления, который вам нужно реализовать __truediv__. Это объясняет разницу, которую вы наблюдаете.

Предположительно, у вас есть доступ к источнику для Primitive. Просто подключите его __div__ метод к __truediv__

0 голосов
/ 02 декабря 2018

Это связано с разным поведением оператора деления между 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'

Вам потребуется определить специальный метод __truediv__, а не __div__, для Python3. Подробнее см. Модели данных для Python 2 и Python 3 .

...