Code Guidelines --------------- A few code guidelines to try to stick to, please comment of none of these make sense, they are pretty basic and mostly apply to old code. However for people who are looking at current code, they make take up bad habits that exist in the current codebase. Strings ------- Try not to use the functions in the string module, they are deprecated. string.join(," ") should be replaced with: " ".join() and: string.split(string, delimeter) should be replaced with: string.split(delimeter) Nearly all other methods in string work on string objects and have similar calling conventions. Comparisons ----------- if foo == None should be replaced with: if foo is not None: Is not does a reference comparison (address1 = address2 basically) and the == forces a by value compare (with __eq__()) Dict Lookups ------------ Try not to use has_key, you can use if foo in dict instead of if dict.has_key(foo) Also don't do stuff like: if foo in dict and dict[foo]: Generally you can do two things here, if you are messing with defaults.. dict.get(foo, some_default) will try to retrieve foo from dict, if there is a KeyError, will insert foo into dict with the value of some_default. This method is preferred in cases where you are messing with defaults: try: dict[foo] except KeyError: dict[foo] = default_value The get call is nicer (compact) and faster (try,except are slow). Imports ------- Import things one per line YES: import os import time import sys NO: import os,sys,time When importing from a module, you may import more than 1 thing at a time. YES: from portage.module import foo, bar, baz Multiline imports are ok (for now :)) Try to group system and package imports separately. YES: import os import sys import time from portage.locks import lockfile from portage.versions import vercmp NO: import os import portage import portage.util import time import sys