11

I accidentally wrote:

total_acc =+ accuracy

instead of:

total_acc += accuracy

I searched the net and could not find anything. So what happened, why does Python think I mean what I am typing?

Computers trust us too much. :)

10
  • 2
    total_acc =+ accuracy is total_acc = +accuracy Commented Feb 5, 2016 at 19:19
  • 4
    Possible duplicate of Logic regarding the use of spaces with Unary Operators in Python3 Commented Feb 5, 2016 at 19:22
  • 1
    There ain't any changes regarding this from 2 to 3. But (imo) this post has way better answers. Hence I am not marking this as dupe. (If there is a better dupe, then I have no probs) Commented Feb 5, 2016 at 19:27
  • 2
    Since you can put as many unary operators in a row as you want, you can really annoy your code reviewers with total_sec+=-+-+-+-+-+-+-+-+-+-+-+-accuracy. Commented Feb 5, 2016 at 19:42
  • 1
    That's almost as evil as it is the greek semicolon in my C++ code @tdelaney. :) Commented Feb 5, 2016 at 19:43

3 Answers 3

9

If you are interested in catching this type of errors early, you can do that with static code analysis. For example, flake8:

$ cat test.py
total_acc = 0
accuracy = 10

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

In this case, it is complaining about the extra space after the +, thinking that you actually meant total_acc = +accuracy. This would have helped you to discover the problem earlier.

FYI, pylint would catch that too.

Sign up to request clarification or add additional context in comments.

1 Comment

Your answer adds really something special here, you deserve an upvote²!
6

This is the same as if you were to do like total_acc = -accuracy, except positive instead of negative. It basically is the same as total_acc = accuracy though, as adding a + before a value does not change it.

This is called an unary operator as there is only one argument (ex: +a) instead of two (ex: a+b).

This link explains it a little more.

Comments

2

It thinks you're doing total_acc = +accuracy, which sets total_acc equal to accuracy. + before a variable without another value causes the variable's __pos__ method to be called. For most types, this is a nop, but there are certain types, e.g. Decimal that implement __pos__.

3 Comments

Yes that's correct, but what happens with + operator?
+ before a value invokes the object's __pos__() method if it has one. Most types don't have such a method, so it's a no-op. Decimal is one type that does use it; stackoverflow.com/questions/16819023/…
@kindall Huh, I did not know that. Good to know, thanks! I'll add that to my answer.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.