Mercurial > pylearn
view doc/v2_planning/API_coding_style.txt @ 1149:7c5dc11c850a
cleaning up api_optimization
author | James Bergstra <bergstrj@iro.umontreal.ca> |
---|---|
date | Thu, 16 Sep 2010 16:26:21 -0400 |
parents | 2da593b0f29d |
children | d7192e52653e |
line wrap: on
line source
========================= Coding Style Guidelines ========================= Main Goals ========== * Code should be compatible with Python 2.4 and above (using 2to3 for conversion to Python 3.x). This may not be possible in the short term for code dependent on Theano. * Code should be easy to read, understand and update by developers and users. * Code should be well-documented and well-tested. Python Coding Guidelines ======================== Official Guidelines ------------------- Source Material ~~~~~~~~~~~~~~~ The three main documents describing our Python coding guidelines are: * `PEP 8 -- Style Guide for Python Code <http://www.python.org/dev/peps/pep-0008>`_ * `PEP 257 -- Docstring Conventions <http://www.python.org/dev/peps/pep-0257>`_ * `Numpy Docstring Standard <http://projects.scipy.org/numpy/wiki/CodingStyleGuidelines#docstring-standard>`_ * `Google Python Style Guide <http://google-styleguide.googlecode.com/svn/trunk/pyguide.html>`_ However, there are a few points mentioned in those documents that we decided to do differently: * Use only one space (not two) after a sentence-ending period in comments. Excerpts ~~~~~~~~ We emphasize here a few important topics that are found in the official guidelines: Additional Recommendations -------------------------- Things you should do even if they are not listed in official guidelines: * Avoid backslashes whenever possible. They make it more difficult to edit code, and they are ugly (as well as potentially dangerous if there are trailing white spaces). .. code-block:: python # Good. if (cond_1 and cond_2 and cond_3): ... # Bad. if cond_1 and \ cond_2 and \ cond_3: ... * When indenting multi-line statements like lists or function arguments, keep elements of the same level aligned with each other. The position of the first element (on the same line or a new line) should be chosen depending on what is easiest to read (sometimes both can be ok). .. code-block:: python # Good. for my_very_long_variable_name in [my_food, my_bar, my_love, my_everything]: ... for my_very_long_variable_name in [ my_foo, my_bar, my_love, my_everything]: ... # Good iff the list needs to be frequently updated. for my_very_long_variable_name in [ my_foo, my_bar, my_love, my_everything, ]: ... # Bad. for my_very_long_variable_name in [my_foo, my_bar, my_love, my_everything]: ... for my_very_long_variable_name in [my_foo, my_bar, my_love, my_everything]: ... The ``logging`` Module vs. the ``warning`` Module ================================================= The ``logging`` Module ---------------------- A central logging facility for Python capable of logging messages of various categories/urgency and choosing with some granularity which messages are displayed/suppressed, as well as where they are displayed or written. This includes an ``INFO`` level for innocuous status information, a ``WARNING`` level for unexpected state that is still recoverable, ``DEBUG`` for detailed information which is only really of interest when things are going wrong, etc. In addition to the `library documentation`_, see this helpful tutorial, `Python Logging 101`_. .. _library documentation: http://docs.python.org/library/logging.html .. _Python Logging 101: http://plumberjack.blogspot.com/2009/09/python-logging-101.html The ``warning`` Module ---------------------- The ``warning`` module in the standard library and its main interface, the ``warn()`` function, allows the programmer to issue warnings in situations where they wish to alert the user to some condition, but the situation is not urgent enough to throw an exception. By default, a warning issued at a given line of the code will only be displayed the first time that line is executed. By default, warnings are written to ``sys.stderr`` but the ``warning`` module contains flexible facilities for altering the defaults, redirecting, etc. Which? When? ------------ It is our feeling that the ``logging`` module's ``WARNING`` level be used to log warnings more meant for *internal*, *developer* consumption, to log situations where something unexpected happened that may be indicative of a problem but is several layers of abstraction below what a user of the library would care about. By contrast, the warning module should be used for warnings intended for user consumption, e.g. alerting them that their version of Pylearn is older than this plugin requires, so things may not work as expected, or that a given function/class/method is slated for deprecation in a coming release (early in the library's lifetime, ``DeprecationWarning`` will likely be the most common case). The warning message issued through this facility should avoid referring to Pylearn internals. Code Sample =========== The following code sample illustrates many of the coding guidelines one should follow in Pylearn. .. code-block:: python import os, sys, time