Why is this legal?

Michael George Lerner mlerner at NOumichSPAM.edu
Wed Sep 8 17:05:02 EDT 2004

I tracked down a bug today that boiled down the "undecorate" part of 
this "decorate-sort-undecorate":

    cluster = [(c.resi,c) for c in cluster] # decorate
    cluster.sort()                          # sort
    cluster = [c for (c.resi,c) in cluster] # undecorate

That last line actually assigns c.resi for each c in cluster.  

Here's a simple example of the same thing:

[mlerner at localhost mlerner]$ python
Python 2.3b2 (#1, Jul  3 2003, 14:20:37)
[GCC 3.2.2 (Mandrake Linux 9.1 3.2.2-3mdk)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> class Foo: pass
>>> f1 = Foo(); f2 = Foo()
>>> f1.x = 'go'; f2.x = 'od'
>>> f1.x+f2.x
>>> things = [f for (f,f.x) in [(f1,'bo'),(f2,'gus')]]
>>> f1.x+f2.x

Is there any reason you'd ever want to do this?

I use pychecker, but I've never actually looked at how it works.
Would it be hard to make pychecker detect something like this?


More information about the Python-list mailing list