aboutsummaryrefslogtreecommitdiffstats
path: root/STYLEGUIDE.txt
diff options
context:
space:
mode:
Diffstat (limited to 'STYLEGUIDE.txt')
-rw-r--r--STYLEGUIDE.txt165
1 files changed, 165 insertions, 0 deletions
diff --git a/STYLEGUIDE.txt b/STYLEGUIDE.txt
new file mode 100644
index 00000000..2063f9ea
--- /dev/null
+++ b/STYLEGUIDE.txt
@@ -0,0 +1,165 @@
+Python coding style guide for GNU Mailman
+Copyright (C) 2002-2003 Python Software Foundation, Barry A. Warsaw
+
+This document contains a style guide for Python programming, as used
+in GNU Mailman. In general, Guido van Rossum's style guide should be
+taken as a basis, as embodied in PEP 8:
+
+ http://python.sourceforge.net/peps/pep-0008.html
+
+however, my (Barry Warsaw's) personal preferences differ from Guido's
+in a few places. "When in Rome..." should apply meaning, when coding
+stuff for Python, Guido's style should rule, however when coding for
+Mailman, I'd like to see my preferences used instead. For software
+like the email package, which is both standalone and distributed in
+Python's standard library, please adhere to the established style,
+which means please use my style.
+
+Remember rule #1, A Foolish Consistency is the Hobgoblin of Little
+Minds. That said, here's a quick outline of where my preferences
+depart from Guido's:
+
+- Imports usually should be on separate lines. While it's sometimes
+ okay to say
+
+ from types import StringType, ListType
+
+ it's never okay to say
+
+ import os, sys
+
+ Put these on separate lines.
+
+- Imports are always put at the top of the file, just after any module
+ comments and docstrings, and before module globals and constants.
+ Imports should be grouped, with the order being
+
+ 1. standard library imports
+ 2. related major package imports (i.e. all email package imports next)
+ 3. application specific imports
+
+ Dotted imports should follow non-dotted imports. Non-dotted imports
+ should be grouped by increasing length, while dotted imports should
+ be grouped roughly alphabetically.
+
+- In general, there should be at most one class per module, if the
+ module contains class definitions. If it's a module of functions,
+ that's fine, group them as common sense dictates. A
+ class-containing module can also contain some helper functions, but
+ it's best to keep these non-public (i.e. use a single leading
+ underscore).
+
+ Always give the class and the module the same name.
+
+ Note though that Zope3's module naming style has a lot of merit.
+ Here, package and module names are all lower cased. I'm
+ experimenting with this approach for Mailman3.
+
+- When importing a class from a class-containing module, it's usually
+ okay to spell this
+
+ from MyClass import MyClass
+ from foo.bar.YourClass import YourClass
+
+ If this spelling causes name clashes, then spell them
+
+ import MyClass
+ import foo.bar.YourClass
+
+ and use "MyClass.MyClass"
+
+- Right hanging comments are discouraged, in favor of preceding
+ comments. E.g.
+
+ foo = blarzigop(bar) # if you don't blarzigop it, it'll shlorp
+
+ should be written as
+
+ # if you don't blarzigop it, it'll shlorp
+ foo = blarzigop(bar)
+
+- Major sections of code in a module should be separated by line feed
+ characters (e.g. ^L -- that's a single character control-L not two
+ characters). This helps with Emacs navigation.
+
+ Always put a ^L before module-level functions, before class
+ definitions, before big blocks of constants which follow imports,
+ and any place else that would be convenient to jump to. Always put
+ two blank lines before a ^L.
+
+- Also put to blank lines between any module level function. Put only
+ one blank line between methods in a class. No blank lines between
+ the class definition and the first method in the class (although
+ class docstrings often go in this space).
+
+- Try to minimize the vertical whitespace in a class. If you're
+ inclined to separate stanzas of code for readability, consider
+ putting a comment in describing what the next stanza's purpose is.
+ Don't put stupid or obvious comments in just to avoid vertical
+ whitespace though.
+
+- Unless internal quote characters would mess things up, the general
+ rule is that single quotes should be used for short strings, double
+ quotes for triple-quoted multi-line strings and docstrings. E.g.
+
+ foo = 'a foo thing'
+ warn = "Don't mess things up"
+ notice = """Our three chief weapons are:
+ - surprise
+ - deception
+ - an almost fanatical devotion to the pope
+ """
+
+- Write docstrings for all public modules, functions, classes, and
+ methods. Docstrings are not necessary and usually discouraged for
+ non-public methods, but you should have a comment that describes
+ what the method does. This comment should appear after the "def"
+ line.
+
+- PEP 257 describes good docstrings conventions. Note that most
+ importantly, the """ that ends a multiline docstring should be on a
+ line by itself, e.g.:
+
+ """Return a foobang
+
+ Optional plotz says to frobnicate the bizbaz first.
+ """
+
+- For one liner docstrings, keep the closing """ on the same line --
+ except for module docstrings!
+
+- <> is strongly preferred over !=
+
+- fill-column for docstrings should be 78.
+
+- Always use string methods instead of string module functions, unless
+ your code must work with Python 1.5.2 (but let's hope not).
+
+- For sequences, (strings, lists, tuples), use the fact that empty
+ sequences are false, so "if not seq" or "if seq" is preferable to
+ "if len(seq)" or "if not len(seq)". Unless you must be compatible
+ with Pythons before 2.2.1, always use True and False instead of 1
+ and 0 for boolean values.
+
+- Always decide whether a class's methods and instance variables
+ should be public or non-public. In general, never make data
+ variables public unless you're implementing essentially a record.
+ It's almost always preferable to give a functional interface to
+ your class instead (Python 2.2's descriptors and properties make
+ this much nicer).
+
+ Also decide whether your attributes should be private or not. The
+ difference between private and non-public is that the former will
+ never be useful for a derived class, while the latter might be.
+ Yes, you should design your classes with inheritance in mind!
+
+ Private attributes should have two leading underscores, no trailing
+ underscores.
+
+ Non-public attributes should have a single leading underscore, no
+ trailing underscores.
+
+ Public attributes should have no leading or trailing underscores
+ (unless they conflict with reserved words, in which case, a single
+ trailing underscore is preferable to a leading one, or a corrupted
+ spelling, e.g. class_ rather than klass).