Как можно оценить +5 в Python?


Как работает оценка + 5 (предупреждение спойлера: результат равен 5)?

Разве + не работает, вызывая метод __add__ на что-то? 5 будет "other " в:

>>> other = 5
>>> x = 1
>>> x.__add__(other)
6

Так что же такое "пустота", позволяющая добавить 5?

void.__add__(5)

Еще одна подсказка:

/ 5

Выдает ошибку:

TypeError: 'int' object is not callable
3 6

3 ответа:

+ в этом случае вызывает унарный магический метод __pos__ скорее, чем __add__:

>>> class A(int):
    def __pos__(self):
        print '__pos__ called'
        return self
...
>>> a = A(5)
>>> +a
__pos__ called
5
>>> +++a
__pos__ called
__pos__ called
__pos__ called
5

Python поддерживает только 4 (унарные арифметические операции) из них __neg__, __pos__, __abs__, и __invert__, отсюда SyntaxError с /. Обратите внимание, что __abs__ работает со встроенной функцией под названием abs(), то есть нет оператора для этой унарной операции.


Обратите внимание, что /5 (/ затем что-то) интерпретируется по-разному только оболочкой IPython, для нормального shell это синтаксическая ошибка, как и ожидалось:

Ashwinis-MacBook-Pro:py ashwini$ ipy
Python 2.7.6 (default, Sep  9 2014, 15:04:36)
Type "copyright", "credits" or "license" for more information.

IPython 3.0.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.
>>> /5
Traceback (most recent call last):
  File "<ipython-input-1-2b14d13c234b>", line 1, in <module>
    5()
TypeError: 'int' object is not callable

>>> /float 1
1.0
>>> /sum (1 2 3 4 5)
15

Ashwinis-MacBook-Pro:~ ashwini$ python
Python 2.7.6 (default, Sep  9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> /5
  File "<stdin>", line 1
    /5
    ^
SyntaxError: invalid syntax
>>> /float 1
  File "<stdin>", line 1
    /float 1
    ^
SyntaxError: invalid syntax

Похоже, что вы нашли один из трех унарных операторов:

    Унарная операция плюс +x вызывает метод __pos__(). Операция унарного отрицания -x вызывает метод __neg__().
  • унарная операция not (или invert) ~x вызывает метод__invert__() .

По ссылке языка на числовые литералы :

Обратите внимание, что числовые литералы не содержат знака; фраза типа -1 является фактически выражением, состоящим из унарного оператора - и литерал 1.

И раздел Об унарных операторах :

Унарный оператор - (минус) дает отрицание его числового значения. аргумент.

Унарный оператор + (plus) возвращает свой числовой аргумент не менявшийся.

Нет унарного оператора / (divide), отсюда и ошибка.

Родственные "магические методы" (__pos__, __neg__) рассматриваются в документации по модели данных.