[Python-projects] pylint: E0601 false negative
Maarten ter Huurne
maarten.ter.huurne at philips.com
Wed Aug 6 19:51:48 CEST 2008
Hi,
In the following Python fragment, the variable "x" is referenced before it
is assigned in two occasions:
def f(n):
if n == 0:
if x == 1:
pass
else:
print x
x = 3
There is a rule in the "variables" checker that should catch errors like
this: message E0601. But for some reason this message is not issued.
The reason seems to be the "if x == 1" statement. If this is replaced by
"pass", the message will be issued.
I looked at the code of the variables checker and the implementation of
E0601 is in the visit_name() method. This is the final part of the
decision whether to issue the message or not:
if (maybee0601
and stmt.source_line() <= defstmt.source_line()
and not is_defined_before(node)
and not are_exclusive(stmt, defstmt)):
self.add_message('E0601', args=name, node=node)
I added some debug prints and the reason the message is not issued is that
"are_exclusive(stmt, defstmt)" returns True. Here "stmt" is the "if x ==
1" statement and "defstmt" is the "x = 3" assignment. Indeed those two
branches are exclusive. However, that is not a valid reason why the use of
"x" should be considered correct. In fact, when the branch in which a
variable is assigned is exclusive to a branch in which a variable is used,
that would be a reason to consider its use wrong.
I hope someone who is more familiar with the pylint code can figure out
what the proper role of are_exclusive() should be for triggering E0601.
Bye,
Maarten
More information about the Python-Projects
mailing list