Redundancy-elimination within the "Style Rules".
diff --git a/PythonStyleGuide.wiki b/PythonStyleGuide.wiki
index ac62057..265cf1a 100644
--- a/PythonStyleGuide.wiki
+++ b/PythonStyleGuide.wiki
@@ -38,27 +38,11 @@
Programs are much easier to maintain when all files have a consistent
style. Here is the canonical Melange Python style.
- # [PythonStyleGuide#Semicolons Semicolons]: _*Avoid*_
- # [PythonStyleGuide#Line_length Line length]: _*80* columns maximum_
- # [PythonStyleGuide#Parentheses Parentheses]: _*Use sparingly*_
# [PythonStyleGuide#Indentation Indentation]: _*2* spaces (*no tabs*),_ *differs from [http://www.python.org/dev/peps/pep-0008/ PEP8]*
- # [PythonStyleGuide#Blank_lines Blank lines]: _*2* for functions and classes, *1* for methods_
- # [PythonStyleGuide#Whitespace Whitespace]: _Sparingly within a line_
# [PythonStyleGuide#Python_Interpreter Python Interpreter]: _Variable, either omitted, `#!/usr/bin/python`, or `#!/usr/bin/python2.7`_
- # [PythonStyleGuide#Comments Comments]: _`__doc__` strings, block, inline_
- * [PythonStyleGuide#Doc_strings `__doc__` Strings]
- * [PythonStyleGuide#Modules Modules]
- * [PythonStyleGuide#Functions_and_Methods Functions and Methods]
- * [PythonStyleGuide#Classes Classes]
- * [PythonStyleGuide#Block_and_Inline_Comments Block and Inline Comments]
- # [PythonStyleGuide#Classes Classes]: _Inherit from object_
- # [PythonStyleGuide#Strings Strings]: _Avoid repeated use of `+` and `+=`_
- # [PythonStyleGuide#TODO_style TODO style]: `TODO(username):` _use a consistent style_
+ # [PythonStyleGuide#Copyright_And_License_Notices Copyright And License Notices]: _Include in every file._
# [PythonStyleGuide#Imports_grouping_and_order Imports grouping, order and sorting]: _One per line, grouped and ordered by packages, sorted alphabetically_
- # [PythonStyleGuide#Statements Statements]: _One per line, avoid [PythonStyleGuide#Semicolons Semicolons]_
- # [PythonStyleGuide#Access_control Access control]: _`foo` if lightweight, `GetFoo()` and `SetFoo()` otherwise_
# [PythonStyleGuide#Naming Naming]: _`foo_bar.py` not `foo-bar.py`,_ *some differ from [http://www.python.org/dev/peps/pep-0008/ PEP8]*
- # [PythonStyleGuide#Main Main]: `if __name__ == '__main__':`
# [PythonStyleGuide#Conclusion Conclusion]: _Look at what's around you!_
= Python Language Rules =
@@ -115,98 +99,6 @@
= Python Style Rules =
-== Semicolons ==
-
-Do not terminate your lines with semi-colons and do not use semi-colons
-to put two commands on the same line.
-
-== Line length ==
-
-Maximum line length is 80 characters.
-
-*Exception:* lines importing modules may end up longer than 80 characters.
-
-Make use of Python's implicit line joining inside parentheses, brackets
-and braces. If necessary, you can add an extra pair of parentheses around
-an expression.
-
-*Yes:*
-
-{{{
-fooBar(self, width, height, color='black', design=None, x='foo',
- emphasis=None, highlight=0)
-
-
-if ((width == 0) and (height == 0)
- and (color == 'red') and (emphasis == 'strong')):
-}}}
-
-When a literal string won't fit on a single line, use parentheses for
-implicit line joining.
-
-{{{
-x = ('This will build a very long long '
- 'long long long long long long string')
-}}}
-
-Make note of the indentation of the elements in the line continuation
-examples above; see the
-[PythonStyleGuide#Indentation indentation section] for explanation.
-
-== Parentheses ==
-
-Use parentheses sparingly. Do not use them:
-
- * in `return` statements
- * in conditional statements unless using parentheses for implied line continuation (see above)
- * around tuples, unless they are necessary syntactically or for clarity
-
-It is, however, fine to use parentheses:
-
- * for implied line continuation
- * around sub-expressions in a larger expression (including the sub-expressions that are part of a conditional statement)
-
-In fact, parentheses around sub-expressions is preferred to relying solely
-on operator precedence.
-
-*Yes:*
-
-{{{
-if foo:
-
-while x:
-
-if x and y:
-
-if not x:
-
-if (x < 3) and (not y):
-
-return foo
-
-for x, y in dict.items():
-
-x, (y, z) = funcThatReturnsNestedTuples()
-}}}
-
-*No:*
-
-{{{
-if (x):
-
-while (x):
-
-if not(x):
-
-if ((x < 3) and (not y)):
-
-return (foo)
-
-for (x, y) in dict.items():
-
-(x, (y, z)) = funcThatReturnsNestedTuples()
-}}}
-
== Indentation ==
_Note that this differs from
@@ -247,109 +139,18 @@
var_four)
}}}
-== Blank lines ==
-
-Two blank lines between top-level definitions, be they function or class
-definitions. One blank line between method definitions and between the
-class line and the first method. One blank line between
-[PythonStyleGuide#Doc_strings `__doc__` strings] and the code that follows
-them. Use single blank lines as you judge appropriate within functions or
-methods.
-Always have a single blank line at the end of the file, this suppresses the "\ No newline at end of file" message that is generated by most diff tools.
-
-== Whitespace ==
-
-No whitespace inside parentheses, brackets or braces.
-
-*Yes:* `spam(ham[1], {eggs: 2}, [])`
-
-*No:* `spam( ham[ 1 ], { eggs: 2 }, [ ] )`
-
-No whitespace before a comma, semicolon, or colon. _Do_ use whitespace
-after a comma, semicolon, or colon except at the end of the line.
-
-*Yes:*
-
-{{{
-if x == 4:
-
-print x, y
-
-x, y = y, x
-}}}
-
-*No:*
-
-{{{
-if x == 4 :
-
-print x , y
-
-x , y = y , x
-}}}
-
-No whitespace before the open paren/bracket that starts an argument
-list, indexing or slicing.
-
-*Yes:* `spam(1)`
-
-*No:* `spam (1)`
-
-*Yes:* `dict['key'] = list[index]`
-
-*No:* `dict ['key'] = list [index]`
-
-Surround binary operators with a single space on either side for
-assignment (`=`), comparisons (`==`, `<`, `>`, `!=`, `<>`, `<=`, `>=`,
-`in`, `not in`, `is`, `is not`), and booleans (`and`, `or`, `not`). Use
-your better judgment for the insertion of spaces around arithmetic
-operators but always be consistent about whitespace on either side of
-a binary operator.
-
-*Yes:* `x == 1`
-
-*No:* `x<1`
-
-Don't use spaces around the '`=`' sign when used to indicate a keyword
-argument or a default parameter value.
-
-*Yes:* `def Complex(real, imag=0.0): return Magic(r=real, i=imag)`
-
-*No:* `def Complex(real, imag = 0.0): return Magic(r = real, i = imag)`
-
=== Python Interpreter ==
Modules which are not intended for direct execution (and which have no effect if executed) should not include a shebang line.
Modules intended for direct execution should begin with a shebang line specifying the Python interpreter used to execute the program, most likely `#!/usr/bin/python` or `#!/usr/bin/python2.7`.
-== Comments ==
+== Copyright And License Notices ==
-=== Doc strings ===
-
-Python has a unique commenting style using `__doc__` strings. A `__doc__`
-string is a string that is the first statement in a package, module,
-class or function. These strings can be extracted automatically through
-the `__doc__()` member of the object and are used by `pydoc`. (Try
-running `pydoc` on your module to see how it looks.) Our convention for
-`__doc__` strings is to use the three double-quote format for strings.
-A `__doc__` string should be organized as a summary line (one physical
-line, [PythonStyleGuide#Line_length 80 characters or less]) terminated
-by a period, followed by a blank line, followed by the rest of the
-`__doc__` string starting at the same cursor position as the first quote
-of the first line. There are more formatting guidelines for `__doc__`
-strings below.
-
-=== Modules ===
-
-Every file should contain a block comment with a copyright notice and
-license statement at the top of the file.
-
-==== Copyright and license notices ====
+Every module should feature the following either at the top or just below
+the module's shebang and blank-comment-following-shebang lines.
{{{
-#!/usr/bin/python2.5
-#
# Copyright [current year] the Melange authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
@@ -365,272 +166,6 @@
# limitations under the License.
}}}
-This should be followed by a `__doc__` string describing the contents
-of the module. Author information is then included after this string.
-If an optional email is provided, then the entire author string
-added to the `__authors__` list needs to be an
-[http://www.ietf.org/rfc/rfc2821.txt RFC 2821 compliant] email address.
-
-==== Module header and authors ====
-
-{{{
-"""A one line summary of the module or script, terminated by a period.
-
-Leave one blank line. The rest of this __doc__ string should contain an
-overall description of the module or script. Optionally, it may also
-contain a brief description of exported classes and functions.
-
- ClassFoo: One line summary.
- functionBar(): One line summary.
-"""
-
-__authors__ = [
- # alphabetical order by last name, please
- '"John Smith" <johnsmith@example.com>',
- '"Joe Paranoid" <joeisgone@example.com>', # email address is required
-]
-}}}
-
-If a new contributor is not yet present in the
-[http://soc.googlecode.com/svn/trunk/AUTHORS AUTHORS file], that contributor
-should be added to that file as part of the first commit from that
-contributor.
-
-=== Functions and Methods ===
-
-Any function or method which is not both obvious and very short needs
-a `__doc__` string. Additionally, any externally accessible function
-or method regardless of length or simplicity needs a `__doc__` string.
-The `__doc__` string should include what the function does and have
-detailed descriptions of the input ("`Args:`") and output
-("`Returns:`", "`Raises:`", or "`Yields:`"). The `__doc__` string
-should give enough information to write a call to the function without
-looking at a single line of the function's code. The `__doc__` string
-should specify the expected types where specific types are required,
-and it should mention any default argument values. A "`Raises:`" section
-should list all exceptions that can be raised by the function. The
-`__doc__` string for generator functions should use "`Yields:`" rather
-than "`Returns:`".
-
-The function or method `__doc__` string should not, generally, describe
-implementation details unless it's some complicated algorithm. For
-tricky code, block/inline comments within the code are more appropriate.
-
-{{{
-def fetchRows(table, keys):
- """Fetch rows from a table.
-
- Args:
- table: An open table.Table instance.
- keys: A sequence of strings representing the key of each table
- row to fetch.
-
- Returns:
- A dict mapping keys to the corresponding table row data
- fetched. Each row is represented as a tuple of strings. For
- example:
-
- {'Serak': ('Rigel VII', 'Preparer'),
- 'Zim': ('Irk', 'Invader'),
- 'Lrrr': ('Omicron Persei 8', 'Emperor')}
-
- If a key from the keys argument is missing from the dictionary,
- then that row was not found in the table.
-
- Raises:
- IOError: An error occurred accessing the table.Table object.
- """
- pass
-}}}
-
-=== Classes ===
-
-Classes should have a `__doc__` string below the class definition
-describing the class. If your class has public attributes they should
-be documented here in an `Attributes:` section.
-
-{{{
-class SampleClass(object):
-
- """Summary of class here.
-
- Longer class information....
- Longer class information....
-
- Attributes:
- likes_spam: A boolean indicating if we like SPAM or not.
- eggs: An integer count of the eggs we have laid.
- """
-
- def __init__(self, likes_spam=False):
- """Inits SampleClass with blah.
-
- Args:
- likes_spam: Initial indication of if the SampleClass
- instance likes SPAM or not (default is False)
- """
- self.likes_spam = likes_spam
- self.eggs = 0
-
- def publicMethod(self):
- """Perform operation blah."""
- pass
-}}}
-
-=== Block and Inline Comments ===
-
-The final place to have comments is in tricky parts of the code. If
-you're going to have to explain it at the next code review, you should
-comment it now. Complicated operations get a few lines of comments
-before the operations commence. Non-obvious ones get comments at the
-end of the line.
-
-{{{
-# We use a weighted dictionary search to find out where i is in
-# the array. We extrapolate position based on the largest number
-# in the array and the array size and then do binary search to
-# get the exact number.
-
-if i & (i-1) == 0: # true iff i is a power of 2
-}}}
-
-These comments should be separated from the code to improve legibility.
-Block comments should be preceded by a blank line. In general,
-end-of-line comments should be at least 2 spaces away from the code. These
-end-of-line comments _can_ be lined up if there are many in a row (or
-in a function), but this is not required.
-
-On the other hand, never describe the code. Assume the person reading
-the code knows Python (though not what you're trying to do) better
-than you do.
-
-{{{
-# BAD COMMENT: Now go through the b array and make sure whenever i occurs
-# the next element is i+1
-}}}
-
-== Classes ==
-
-If a class inherits from no other base classes, explicitly inherit from
-`object`. This also applies to nested classes.
-
-*No:*
-
-{{{
-class SampleClass:
- pass
-
-class OuterClass:
- class InnerClass:
- pass
-}}}
-
-*Yes:*
-
-{{{
-class SampleClass(object):
- pass
-
-class OuterClass(object):
- class InnerClass(object):
- pass
-
-class ChildClass(ParentClass):
- """Explicitly inherits from another class already."""
- pass
-}}}
-
-Inheriting from `object` is needed to make properties work properly, and
-it will protect our code from one particular flavor of things that might
-break once we switch to Python 3000. It also defines special methods that
-implement the default semantics of objects including `__new__`,
-`__init__`, `__delattr__`, `__getattribute__`, `__setattr__`, `__hash__`,
-`__repr__`, and `__str__`.
-
-== Strings ==
-
-Use the `%` operator for formatting strings, even when the parameters
-are all strings. Use your best judgement to decide between `+` and `%`
-though.
-
-*No:*
-
-{{{
-x = '%s%s' % (a, b) # use + in this case
-x = imperative + ', ' + expletive + '!'
-x = 'name: ' + name + '; score: ' + str(n)
-}}}
-
-*Yes:*
-
-{{{
-x = a + b
-x = '%s, %s!' % (imperative, expletive)
-x = 'name: %s; score: %d' % (name, n)
-}}}
-
-Avoid using the `+` and `+=` operators to accumulate a string within
-a loop. Since strings are immutable, this creates unnecessary temporary
-objects and results in quadratic rather than linear running time.
-Instead, add each sub-string to a `list` and `''.join()` that list after
-the loop terminates.
-
-*No:*
-
-{{{
-employee_table = '<table>'
-for last_name, first_name in employee_list:
- employee_table += '<tr><td>%s, %s</td></tr>' % (last_name, first_name)
-employee_table += '</table>'
-}}}
-
-*Yes:*
-
-{{{
-items = ['<table>']
-for last_name, first_name in employee_list:
- items.append('<tr><td>%s, %s</td></tr>' % (last_name, first_name))
-items.append('</table>')
-employee_table = ''.join(items)
-}}}
-
-Use `"""` for multi-line strings rather than `'''`. Note, however, that
-it is often cleaner to use implicit line joining since multi-line
-strings do not flow with the indentation of the rest of the program:
-
-*No:*
-{{{
- print """This is pretty ugly.
-Don't do this.
-"""
-}}}
-
-*Yes:*
-
-{{{
- print ("This is much nicer.\n"
- "Do it this way.\n")
-}}}
-
-== TODO style ==
-
-Use `TODO` comments for code that is temporary, a short-term solution,
-or good-enough but not perfect.
-
-`TODO`s should include the string `TODO` in all caps, followed by your
-`username` in parentheses: `TODO(username)`. A colon is optional. The
-main purpose is to have a consistent `TODO` format searchable by `username`.
-
-{{{
-# TODO(someuser): Use a "*" here for concatenation operator.
-# TODO(anotheruser) change this to use relations.
-}}}
-
-If your `TODO` is of the form "At a future date do something" make sure
-that you either include a very specific date ("Fix by November 2008")
-or a very specific event ("Remove this code after the Foo entities in
-the datastore have all added the new fubar property.").
-
== Imports grouping and order ==
Imports should be on separate lines, e.g.:
@@ -675,49 +210,6 @@
from b_soc import d
}}}
-== Statements ==
-
-Generally only one statement per line. However, you may put the result
-of a test on the same line as the test only if the entire statement
-fits on one line. In particular, you can never do so with `try/except`
-since the `try` and `except` can't both fit on the same line, and you
-can only do so with an `if` if there is no `else`.
-
-*Yes:*
-
-{{{
-if foo: fuBar(foo)
-}}}
-
-*No:*
-
-{{{
-if foo: fuBar(foo)
-else: fuBaz(foo)
-
-try: fuBar(foo)
-except ValueError: fuBaz(foo)
-
-try:
- fuBar(foo)
-except ValueError: fuBaz(foo)
-}}}
-
-== Access control ==
-
-If an accessor function would be trivial you should use public variables
-instead of accessor functions to avoid the extra cost of function calls
-in Python. When more functionality is added you can use property to keep
-the syntax consistent.
-
-On the other hand, if access is more complex, or the cost of accessing
-the variable is significant, you should use function calls (following
-the [PythonStyleGuide#Naming Naming guidelines]) such as `getFoo()` and
-`setFoo()`. If the past behavior allowed access through a property, do
-not bind the new accessor functions to the property. Any code still
-attempting to access the variable by the old method should break visibly
-so callers are made aware of the change in complexity.
-
== Naming ==
=== Names to avoid ===
@@ -760,26 +252,6 @@
in Python, and `property` can be used later to turn attribute access into a
function call without changing the access syntax.
-== Main ==
-
-Every Python source file should be importable. In Python, `pychecker`,
-`pydoc`, and unit tests require modules to be importable. Your code
-should always check `if __name__ == '__main__':` before executing your
-main program so that the main program is not executed when the module
-is imported. The capitalization of `main()` is intentionally inconsistent
-with the rest of the naming conventions, which would suggest `Main()`.
-
-{{{
-if __name__ == '__main__':
- # parse arguments
- main()
-}}}
-
-All code at the top level will be executed when the module is imported.
-Be careful not to call functions, create objects, or perform other
-operations that should not be executed when the file is being `pycheck`ed
-or `pydoc`ed.
-
== Conclusion ==
_BE CONSISTENT._
@@ -801,4 +273,4 @@
_Copyright 2008 Google Inc._
_This work is licensed under a_
[http://soc.googlecode.com/svn/wiki/html/licenses/cc-by-attribution-2_5.html Creative Commons Attribution 2.5 License].
-[http://creativecommons.org/licenses/by/2.5/ http://soc.googlecode.com/svn/wiki/html/licenses/cc-by-2_5-88x31.png]
\ No newline at end of file
+[http://creativecommons.org/licenses/by/2.5/ http://soc.googlecode.com/svn/wiki/html/licenses/cc-by-2_5-88x31.png]