[Python-Dev] Draft Guide for code migration and modernation

Raymond Hettinger python@rcn.com
Mon, 3 Jun 2002 14:51:20 -0400

Here is my cut at the migration and modernization guide.

Comments are welcome.

Walter and Neal, would you like to add the somewhat more involved steps for
eliminating the types and strings modules.

Raymond Hettinger


Code Modernization and Migration Guide

Pattern:    if d.has_key(k):  --> if k in d:
Idea:   For testing dictionary membership, use the 'in' keyword instead of
the 'has_key()' method.
Version:   2.2 or greater
Benefits:   The result is shorter and more readable. The style becomes
consistent with tests for membership in lists.  The result is slightly
faster because has_key requires an attribute search.
Locating: grep has_key
1. if dictlike.has_key(k) ## objects like shelve do not define

Pattern:    for k in d.keys()  -->  for k in d
                for k in d.items() --> for k in d.iteritems()
                for k in d.values() -->  for k in d.itervalues()
Idea:   Use the new iter methods for looping over dictionaries
Version:   2.2 or greater
Benefits:   The iter methods are faster because the do not have to create a
new list object with a complete copy of all of the keys, values, or items.
Selecting only keys, items, or values as needed saves the time for creating
unused object references and, in the case of items, saves a second hash
look-up of the key.
1. def getids():  return d.keys()  ## do not change the return type
2. for k in dictlike.keys() ## objects like shelve do not define itermethods
3. k = d.keys(); j = k[:]   ## iterators do not support slicing, sorting or
other operations
4. for k in d.keys(): del[k] ## dict iterators prohibit modifying the

Pattern:    if v == None  -->  if v is None:
Idea:   Since there is only one None object, it can be tested with identity.
Version:   Any
Benefits:   Identity tests are slightly faster than equality tests. Also,
some object types may overload comparison to be much slower (or even break).
Locating: grep '== None' or grep '!= None'

Pattern:    os.stat("foo")[stat.ST_MTIME] --> os.stat("foo").st_mtime
                os.stat("foo")[stat.ST_MTIME] --> os.path.getmtime("foo")
Idea:   Replace stat contants or indices with new stat methods
Version:   2.2 or greater
Benefits:   The methods are not order dependent and do not require an import
of the stat module
Locating: grep os.stat

Pattern:    import whrandom --> import random
Idea:   Replace deprecated module
Version:   2.1 or greater
Benefits:   All random methods collected in one place
Locating:   grep whrandom