Hello everyone,

I took another approach to fix this bug (it is done against kevinw's fork but I 
hope those projects will soon merge). 

The change:
https://github.com/saper/pyflakes/commit/09c52fcfab742b4f67c9d21d18ae389c300b4ea6

Updated tests:
https://github.com/saper/pyflakes/commit/5d2b7563cb63b080c99f6df24661dd9dcec188e1

The code can be easily cloned from github with

git clone git://github.com/saper/pyflakes.git

My approach, while not perfect and still to be fine-tuned, is different: 
whenever a RedefinedWhileUnused exception is to be raised, additional check is 
made whether "existing" (already detected existing name binding) and "loc" 
(current "redefinition") do not reside on
different "forks" of if: else: or try: except: else: blocks.

First, AST tree is searched upwards for both of them to find a common ancestor. 
If this is "IF"
or "TRYEXCEPT", there is a good chance that they might be under different 
blocks (like "if:"
or "else:"). Appropriate lists are checked, and exception is raised in case of:

try:
  import os
  import os
except: 
  pass

but not

try:
  import os
except:
  import os

it does not matter what exception is raised/checked, of course conditions are 
not evaluated
(as this is not a dynamic analysis), but it seems to work fine for most typical 
Python
idioms when importing modules using if: or try:

I'd love to hear your feedback on this approach!

-- 
https://code.launchpad.net/~dobey/divmod.org/pyflakes-less-redef/+merge/130183
Your team Divmod-dev is subscribed to branch lp:divmod.org.

-- 
Mailing list: https://launchpad.net/~divmod-dev
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~divmod-dev
More help   : https://help.launchpad.net/ListHelp

Reply via email to