Неподдерживаемый тип (ы) операндов для /: 'Vector3' и 'int' [duplicate]

Source = "file: /// D: /100x100.jpg" /> работает для меня.

4
задан sudheesh ks 19 March 2015 в 23:19
поделиться

2 ответа

Специальный метод object.__truediv__() - только , используемый с оператором /, и только тогда, когда вы переключили компилятор Python на использование истинного деления с помощью:

from __future__ import division

Если вы не использовали этот импорт, оператор / вызывает специальный метод object.__div__() , если он присутствует.

С другой стороны, оператор // вызывает специальный метод object.__floordiv__() , который вы не реализовали.

8
ответ дан Martijn Pieters 22 August 2018 в 20:38
поделиться
  • 1
    Я использовал оператор /. так как a / b a и b - две фракции. другие операции работают правильно. я должен добавить строку "из будущего раздела импорта" в моем коде? – sudheesh ks 19 March 2015 в 23:07
  • 2
    @sudheeshks: вам нужно реализовать методы __div__ и __floordiv__. – Martijn Pieters♦ 19 March 2015 в 23:08
  • 3
    @sudheeshks: from __future__ import division применяется к коду, который использует ваш класс Fraction; Python будет либо называть Fraction.__div__, либо Fraction.__floordiv__ на основе этого параметра. – Martijn Pieters♦ 19 March 2015 в 23:09
  • 4
    извините, это вопрос упражнений для меня. вопрос заключается в реализации truediv – sudheesh ks 19 March 2015 в 23:10
  • 5
    @sudheeshks: тогда вам нужно добавить from __future__ import division вверху вашего кода и использовать оператор разделения /. – Martijn Pieters♦ 19 March 2015 в 23:13

Из docs :

object.__div__(self, other) 
object.__truediv__(self, other)

Этими методами реализуется оператор деления (/). Метод __truediv__() используется, когда действует __future__.division, в противном случае используется __div__(). Если определен только один из этих двух методов, объект не будет поддерживать деление в альтернативном контексте; TypeError будет поднят вместо этого.

И здесь :

Будущий оператор является директивой для компилятора, что конкретный [ python] должна быть скомпилирована с использованием синтаксиса или семантики, которые будут доступны в ... будущей версии Python. Будущий оператор предназначен для облегчения перехода на будущие версии Python, которые вносят несовместимые изменения в язык. Он позволяет использовать новые функции перед выпуском, в котором эта функция становится стандартной.

future_statement: from __future__ import feature

Функции, распознаваемые Python 2.x, - это unicode_literals, print_function, absolute_import, division, generators, nested_scopes и with_statement

Теперь некоторые тесты:

~$ python2.7
Python 2.7.6 (v2.7.6:3a1db0d2747e, Nov 10 2013, 00:42:54) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 3/2
1
>>> exit()

~$ python3.2
Python 3.2.3 (v3.2.3:3d0686d90f55, Apr 10 2012, 11:25:50) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 3/2
1.5

Итак, вы видите, что действие оператора / изменилось на python 3.x. Вы также можете увидеть это в следующем примере:

class Dog(object):
    def __div__(self, other):
        print("__div__ called")
    def __truediv__(self, other):
        print("__truediv__ called")


Dog() / Dog()

--output:--
~/python_programs$ python2.7 myprog.py 
__div__ called

~/python_programs$ python3.4 myprog.py
__truediv__ called

Поскольку __truediv__ не вызывается оператором / в python 2.x, переопределяя __truediv__ в python 2.x не имеет никакого эффекта.

PEP 238 - PEP 238 -- Changing the Division Operator

We propose the following transitional measures:

    - Classic division will remain the default in the Python 2.x
      series; true division will be standard in Python 3.0.

    - The // operator will be available to request floor[, i.e. integer,] 
      division unambiguously.

    - The future division statement, spelled "from __future__ import
      division", will change the / operator to mean true division
      throughout the [program]

Теперь посмотрите, что здесь происходит:

from __future__ import division

class Dog(object):
    def __div__(self, other):
        print("__div__ called")
    def __truediv__(self, other):
        print("__truediv__ called")


Dog() / Dog()

--output:--
~/python_programs$ python2.7 myprog.py 
__truediv__ called

~/python_programs$ python3.4 myprog.py
__truediv__ called

Теперь вы получаете эффект python3.x для оператора / в python 2.x. Итак, теперь вы можете переопределить __truediv__, чтобы оператор / выполнял то, что вы хотите.

Обратите внимание: если вы хотите, чтобы целочисленное деление в python 3.x, т. Е. 3/2 => 1, тогда вам нужно используйте оператор //, который реализуется __floordiv__. Аналогично, если вы выполняете from __future__ import division в python 2.x, то для получения целочисленного деления вам необходимо использовать оператор //; и если вы хотите переопределить оператор // в классе, вам нужно реализовать __floordiv__.

9
ответ дан 7stud 22 August 2018 в 20:38
поделиться
  • 1
    Большое вам спасибо за подробный ответ – sudheesh ks 20 March 2015 в 15:11
Другие вопросы по тегам:

Похожие вопросы: