os.path.walk not pruning descent tree (and I'm not happy with that behavior?)

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Mon May 28 04:47:21 EDT 2007


En Mon, 28 May 2007 05:25:18 -0300, Maric Michaud <maric at aristote.info>  
escribió:

> Gabriel Genellina a écrit :
>> - iterate backwards:
>>
>> for i in range(len(names)-1, -1, -1):
>>    fname = names[i]
>>    if fname[:1]=='.':
>>      names.remove(fname)
>>
>
> This is not about iterating backward, this is about iterating over the
> index of each element instead of iterating over the element (which must
> be done begining by the end). In fact this code is both inefficient and
> contains a subtle bug. If two objects compare equals in the list, you
> will remove the wrong one.
>
> It should be :
>
> for i in range(len(names)-1, -1, -1):
>     if names[i][:1]=='.':
>       del names[i]

Yes, sure, this is what I should have written. Thanks for the correction!

>> - filter and reassign in place
>
> Seems the best here.
>
>> (the [:] is important):
>
> Not so. Unless "names" is referenced in another namespace, simple
> assignment is enough.

But this is exactly the case; the visit function is called from inside the  
os.path.walk code, and you have to modify the names parameter in-place for  
the caller to notice it (and skip the undesided files and folders).

-- 
Gabriel Genellina




More information about the Python-list mailing list