Style Guide For Python Code

Start from the beginning
                                        

      feature is being removed in Python 2.6.

      Modules or packages should define their own domain-specific base

      exception class, which should be subclassed from the built-in Exception

      class.  Always include a class docstring.  E.g.:

        class MessageError(Exception):

            """Base class for errors in the email package."""

      Class naming conventions apply here, although you should add the suffix

      "Error" to your exception classes, if the exception is an error.

      Non-error exceptions need no special suffix.

    - When raising an exception, use "raise ValueError('message')" instead of

      the older form "raise ValueError, 'message'".

      The paren-using form is preferred because when the exception arguments

      are long or include string formatting, you don't need to use line

      continuation characters thanks to the containing parentheses.  The older

      form will be removed in Python 3000.

    - When catching exceptions, mention specific exceptions

      whenever possible instead of using a bare 'except:' clause.

      For example, use:

          try:

              import platform_specific_module

          except ImportError:

              platform_specific_module = None

      A bare 'except:' clause will catch SystemExit and KeyboardInterrupt

      exceptions, making it harder to interrupt a program with Control-C,

      and can disguise other problems.  If you want to catch all

      exceptions that signal program errors, use 'except Exception:'.

      A good rule of thumb is to limit use of bare 'except' clauses to two

      cases:

         1) If the exception handler will be printing out or logging

            the traceback; at least the user will be aware that an

            error has occurred.

         2) If the code needs to do some cleanup work, but then lets

            the exception propagate upwards with 'raise'.

            'try...finally' is a better way to handle this case.

    - Additionally, for all try/except clauses, limit the 'try' clause

      to the absolute minimum amount of code necessary.  Again, this

      avoids masking bugs.

      Yes:

          try:

              value = collection[key]

          except KeyError:

              return key_not_found(key)

          else:

              return handle_value(value)

      No:

          try:

              # Too broad!

              return handle_value(collection[key])

          except KeyError:

              # Will also catch KeyError raised by handle_value()

              return key_not_found(key)

    - Use string methods instead of the string module.

      String methods are always much faster and share the same API with

      unicode strings.  Override this rule if backward compatibility with

      Pythons older than 2.0 is required.

    - Use ''.startswith() and ''.endswith() instead of string slicing to check

      for prefixes or suffixes.

      startswith() and endswith() are cleaner and less error prone.  For

      example:

        Yes: if foo.startswith('bar'):

        No:  if foo[:3] == 'bar':

      The exception is if your code must work with Python 1.5.2 (but let's

      hope not!).

    - Object type comparisons should always use isinstance() instead

      of comparing types directly.

        Yes: if isinstance(obj, int):

        No:  if type(obj) is type(1):

      When checking if an object is a string, keep in mind that it might be a

      unicode string too!  In Python 2.3, str and unicode have a common base

      class, basestring, so you can do:

        if isinstance(obj, basestring):

    - For sequences, (strings, lists, tuples), use the fact that empty

      sequences are false.

      Yes: if not seq:

           if seq:

      No: if len(seq)

          if not len(seq)

    - Don't write string literals that rely on significant trailing

      whitespace.  Such trailing whitespace is visually indistinguishable and

      some editors (or more recently, reindent.py) will trim them.

    - Don't compare boolean values to True or False using ==

        Yes:   if greeting:

        No:    if greeting == True:

        Worse: if greeting is True:

Rules that apply only to the standard library

    - Do not use function type annotations in the standard library.

      These are reserved for users and third-party modules.  See

      PEP 3107 and the bug 10899 for details.

Docstring ConventionsWhere stories live. Discover now