=+ Python operator is syntactically correct
Asked Answered
T

3

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. :)

Tiertza answered 5/2, 2016 at 19:16 Comment(10)
total_acc =+ accuracy is total_acc = +accuracyApologetics
Oh so when you want the negative value, you don't do *(-1), thanks @Clodion! Didn't know that.Tiertza
Possible duplicate of Logic regarding the use of spaces with Unary Operators in Python3Sink
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)Thrombocyte
Also @Tiertza total_acc = ​ ​ ​ ​ + ​ ​ ​ ​ ​ accuracy would work ;)Thrombocyte
Oh why the downvote? If it's something that should be improved, please let me know! Why @BhargavRao?Tiertza
@BhargavRao I do not care about the rep, I just want to know if the question has something bad that the future reader should not read, that's why I am asking and I did not imply that you did. :) Can you explain why this will work?Tiertza
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.Pail
That's almost as evil as it is the greek semicolon in my C++ code @tdelaney. :)Tiertza
@Tiertza Python ignores all the spaces between operators and operands. Thus even your print statements can look like print ( ​ ​ ​ ​ "something" ​ ​ ​ ​ ​).Thrombocyte
S
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.

Supportable answered 5/2, 2016 at 19:18 Comment(0)
B
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.

Barbe answered 5/2, 2016 at 19:22 Comment(1)
Your answer adds really something special here, you deserve an upvote²!Tiertza
S
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.

Supportable answered 5/2, 2016 at 19:18 Comment(0)
R
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__.

Rode answered 5/2, 2016 at 19:18 Comment(3)
Yes that's correct, but what happens with + operator?Tiertza
+ 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; #16819523Alexina
@Alexina Huh, I did not know that. Good to know, thanks! I'll add that to my answer.Rode

© 2022 - 2024 — McMap. All rights reserved.