Coding conventions ================== It's very important that everyone who works in a project follows the same coding conventions. Thus, this is an outline of the coding style that is used in Source.Python. We are trying to follow `PEP8 `_ and `PEP257 `_ as close as possible. Naming conventions ------------------ 1. Class names should use CamelCase. .. code-block:: python class TestClass(object): pass 2. No underscores in class names except for a leading underscore to as "private". .. code-block:: python class _PrivateTestClass(object): pass 3. Constants must be ALL_CAPS with an underscore separating the words. .. code-block:: python CONSTANT_VALUE = True 4. Class attributes/properties/methods should be lower_case_with_underscores. .. code-block:: python class TestClass(object): def __init__(self, value1, value2): self.value1 = value1 self._value2 = value2 @property def value2(self): return self._value2 def some_method(self): return self.value1 + self.value2 5. Singleton objects or "the instance" objects (objects that should be the one and only instance of a class) should also use lower_case_with_underscores. .. code-block:: python class TestClass(object): pass test_class = TestClass() 6. All global variable objects (which are not constants) should also use lower_case_with_underscores. .. code-block:: python start_value = True 7. Any global variables created in the scope which are not to be imported by other modules should use a leading underscore. .. code-block:: python _private_variable = False 8. Never use two leading and/or two trailing underscores. 9. **All** names should be very descriptive as to what the object does or is. Formatting ---------- 1. Lines must be no longer than 80 characters (that includes the built-in \\n, making it 79 characters of code). 2. **Must** use 4 space indentation, no TABs. 3. **Must** have 2 blank lines prior to functions and classes. * If the function/class is starting a new
(explained below), the blank lines need to be prior to the section separator. 4. All other lines should only have 1 blank line between. * An exception that is sometimes used is 2 blank lines prior to a
change (explained below) 5. No extra whitespace at the end of a line. * This also means that any "blank" lines should have absolutely nothing, not even spaces, in them. 6. Exactly 1 space between arguments (after the comma) for all functions/classes/methods, including when calling them. * No leading space before first argument or trailing space after last argument. 7. Exactly one space after a colon (:) when setting an item in a dictionary. 8. There must be exactly one blank line at the end of the file. Documentation ------------- 1. All classes/methods/properties/functions must be followed by a comment using a triple quote docstring (using quotes and not apostrophes). 2. Most lines of code should follow a one line comment (using the # character). * Some exceptions apply, like comments that suffice for multiple lines. 3. Files should always start with this line. .. code-block:: python # ../ 4. Different sections of code should be separated by the following lines (where
should describe what is in the following section). .. code-block:: python # ============================================================================= # >>
# ============================================================================= * Some examples of what
types there are to be used: * IMPORTS * GLOBAL VARIABLES * CLASSES * FUNCTIONS Import comments --------------- 1. Separate base Python imports (including site-packages) from Source.Python imports with 1 blank line. 2. Use a comment line with 1 space after the # showing whether the current section is from Python or Source.Python. 3. Python imports should always go first, then Source.Python imports. 4. Separate each module by using a comment about which module is being imported (with 3 spaces after the # before the modules name). 5. Modules should be listed in alphabetic order. Example: .. code-block:: python # ============================================================================= # >> IMPORTS # ============================================================================= # Python Imports # Configobj from configobj import ConfigObj # OS from os.path import dirname from os.path import join # Traceback from traceback import format_exception # Source.Python Imports # Core from core.version import is_newer_version_available from core.version import VERSION # Events from events import Event # Paths from paths import GAME_PATH Do's and don'ts of importing ---------------------------- 1. Never import "all" from a module. .. code-block:: python # Bad from something import * # Good from something import one_object from something import second_object 2. For "most" imports, import each object individually, and on a separate line. .. code-block:: python # Bad from os.path import dirname, join, curdir # Good from os.path import dirname from os.path import join from os.path import curdir # "Ok", but use only when necessary import os.path import sys