On 26/03/2016 12:05, Chris Angelico wrote:
On Fri, Mar 25, 2016 at 11:06 PM, Aleksander Alekseev <afis...@devzen.ru> wrote:
Recently I spend half an hour looking for a bug in code like this:

eax@fujitsu:~/temp$ cat ./t.py
#!/usr/bin/env python3

for x in range(0,5):
     if x % 2 == 0:
         next
     print(str(x))

eax@fujitsu:~/temp$ ./t.py
0
1
2
3
4

Is it possible to make python complain in this case? Or maybe solve
such an issue somehow else?
I think what you're looking for here is an acknowledgement that
evaluating the name "next" accomplishes nothing. That's not really
something the Python interpreter should be looking at (hey, you might
have good reason for doing that), but there are linters that can
detect this kind of dead code. Some of them tie into programmer's
editors, so you could get a nice little warning message right in the
window where you're typing your code. Look into some of the top-end
editors (free or commercial) and see what you think of them - they can
save you no end of time.

ChrisA
So intrigued by this question I tried the following
def fnc( n ):
    print "fnc called with parameter '%d'" % n
    return n

for i in range(0,5):
    if i%2 == 0:
        fnc
        next
    print i

and got the same result as the OP

D:\projects\python
>>python next.py
0
1
2
3
4
D:\projects\python
>>

A couple of tests showed that the only important thing about the name in the if clause is that it is known at runtime and then it is silently ignored. However, if the name is not known/accessible at run time a 'NameError' is raised,
NameError: name 'mynewfn123' is not defined

On the other hand the following if clause
    if i%2 == 0:
        fnc    next

results in a compiler error,
D:\projects\python
>>python next.py
  File "next.py", line 9
    fnc next
           ^
SyntaxError: invalid syntax

This is all for Python 2.7.9. (Don't know about Python 3....).

So I have sympathy with the OP, I would expect the compiler to pick this up - indeed it does so for two (or more ?) unused names on a single line. That is unless someone can give a useful use of this behaviour or is there something going on under the Python hood I'm not aware of?

It would be all to easy to write a series of lines just calling functions and forget the () on one of them. Not fun programming. It's also a good reminder that the meaning of a keyword in language A is not necessarily the same in language B (ie 'next', Python) So on this last point is this behaviour of Python defined somewhere in the docs?

Regards all,
John

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to