Как можно оценить +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 ответа:
+
в этом случае вызывает унарный магический метод__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__
) рассматриваются в документации по модели данных.