================ Style Guidelines ================ Python Code ----------- * Generally follow Python's `PEP8 `__ style guidelines. We run the pep8 command to verify this during unittest runs. * Break up logical blocks of related code with a newline. Specifically add a blank newline after conditional or looping blocks. * Don't comment what is obvious. Instead prefer meaningful names of functions and variables: .. code:: python # Get the functions signal annotations <-- this comment is unnecessary return_type, arg_types = get_signal_annotations(func) * Use comments to explain non-obvious blocks and conditionals, magic, workarounds (with bug references), or generally complex pieces of code. Good examples: .. code:: python # If a property was defined with a decorator, it may already have # a name; if it was defined with an assignment (prop = Property(...)) # we set the property's name to the member name if not prop.name: prop.name = name .. code:: python # Python causes MRO's to be calculated starting with the lowest # base class and working towards the descendant, storing the result # in __mro__ at each point. Therefore at this point we know that # we already have our base class MRO's available to us, there is # no need for us to (re)calculate them. if hasattr(base, '__mro__'): bases_of_subclasses += [list(base.__mro__)] Python Doc Strings ------------------ * Doc strings should generally follow `PEP257 `__ unless noted here. * Use `reStructuredText (resST) `__ annotations. * Use three double quotes for doc strings (``"""``). * Use a brief description on the same line as the triple quote. * Include function parameter documentation (including types, returns, and raises) between the brief description and the full description. Use a newline with indentation for the parameters descriptions. .. code:: python def spam(amount): """Creates a Spam object with the given amount. :param int amount: The amount of spam. :returns: A new Spam instance with the given amount set. :rtype: Spam :raises ValueError: If amount is not a numeric type. More complete description. """ * For class documentation, use the classes doc string for an explanation of what the class is used for and how it works, including Python examples. Include ``__init__`` argument documentation after the brief description in the classes doc string. The class ``__init__`` should generally be the first method defined in a class putting it as close as possible (location wise) to the class documentation. .. code:: python class Bacon(CookedFood): """Bacon is a breakfast food. :param CookingType cooking_type: Enum for the type of cooking to use. :param float cooking_time: Amount of time used to cook the Bacon in minutes. Use Bacon in combination with other breakfast foods for a complete breakfast. For example, combine Bacon with other items in a list to make a breakfast: .. code-block:: python breakfast = [Bacon(), Spam(), Spam(), Eggs()] """ def __init__(self, cooking_type=CookingType.BAKE, cooking_time=15.0): super(Bacon, self).__init__(cooking_type, cooking_time)