2016-02-05 2 views
9

я случайно написал:оператор = + Python синтаксически правильно

total_acc =+ accuracy 

вместо:

total_acc += accuracy 

Я искал сеть и не смогли найти anything. Итак, что случилось, почему Python думает, что я имею в виду то, что я набираю?

Компьютеры доверяют нам слишком много. :)

+2

'total_acc = + precision' является' total_acc = + precision' – Clodion

+0

О, когда вам нужно отрицательное значение, вы не делаете * (- 1), спасибо @Clodion! Не знал этого. – gsamaras

+3

Возможный дубликат [Логика относительно использования пробелов с унарными операторами в Python3] (http://stackoverflow.com/questions/35208351/logic-regarding-the-use-of-spaces-with-unary-operators-in- python3) – zondo

ответ

5

Это то же самое, как если бы вы делали как total_acc = -accuracy, за исключением положительных, а не отрицательных. Это в основном то же самое, что и total_acc = accuracy, но, добавив + до значения, это не изменит.

Это называется унарный оператор как есть только один аргумент (например: +a) вместо двух (например: a+b).

This link объясняет это немного больше.

2

Он думает, что вы делаете total_acc = +accuracy, который устанавливает total_acc, равный accuracy. +, прежде чем переменная без другого значения вызовет метод переменной __pos__. Для большинства типов это nop, но существуют определенные типы, например. Decimal это осуществление __pos__.

+0

Да, это правильно, но что происходит с оператором '+'? – gsamaras

+3

'+' перед значением вызывает метод '__pos __()' объекта, если он есть. Большинство типов не имеют такого метода, поэтому он не работает. «Десятичный» - это один тип, который его использует; https://stackoverflow.com/questions/16819023/whats-the-purpose-of-the-pos-unary-operator-in-python – kindall

+0

@kindall Да, я этого не знал. Полезно знать, спасибо! Я добавлю это к моему ответу. –

7

Если вы заинтересованы в обнаружении этого типа ошибок на раннем этапе, вы можете сделать это с помощью анализа статического кода . Например, flake8:

$ cat test.py 
total_acc = 0 
accuracy = 10 

total_acc =+ accuracy 
$ flake8 test.py 
test.py:4:12: E225 missing whitespace around operator 

В этом случае, он жалуется на дополнительное место после +, думая, что вы на самом деле имел в виду total_acc = +accuracy. Это помогло бы вам обнаружить проблему раньше.

FYI, pylint поймает это тоже.

+2

Ваш ответ добавляет * действительно * что-то особенное здесь, вы заслуживаете upvote²! – gsamaras

Смежные вопросы