mirror of https://github.com/pallets/flask.git
				
				
				
			
		
			
				
	
	
		
			201 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
| Pocoo Styleguide
 | |
| ================
 | |
| 
 | |
| The Pocoo styleguide is the styleguide for all Pocoo Projects, including
 | |
| Flask.  This styleguide is a requirement for Patches to Flask and a
 | |
| recommendation for Flask extensions.
 | |
| 
 | |
| In general the Pocoo Styleguide closely follows :pep:`8` with some small
 | |
| differences and extensions.
 | |
| 
 | |
| General Layout
 | |
| --------------
 | |
| 
 | |
| Indentation:
 | |
|   4 real spaces.  No tabs, no exceptions.
 | |
| 
 | |
| Maximum line length:
 | |
|   79 characters with a soft limit for 84 if absolutely necessary.  Try
 | |
|   to avoid too nested code by cleverly placing `break`, `continue` and
 | |
|   `return` statements.
 | |
| 
 | |
| Continuing long statements:
 | |
|   To continue a statement you can use backslashes in which case you should
 | |
|   align the next line with the last dot or equal sign, or indent four
 | |
|   spaces::
 | |
| 
 | |
|     this_is_a_very_long(function_call, 'with many parameters') \
 | |
|         .that_returns_an_object_with_an_attribute
 | |
| 
 | |
|     MyModel.query.filter(MyModel.scalar > 120) \
 | |
|                  .order_by(MyModel.name.desc()) \
 | |
|                  .limit(10)
 | |
| 
 | |
|   If you break in a statement with parentheses or braces, align to the
 | |
|   braces::
 | |
| 
 | |
|     this_is_a_very_long(function_call, 'with many parameters',
 | |
|                         23, 42, 'and even more')
 | |
| 
 | |
|   For lists or tuples with many items, break immediately after the
 | |
|   opening brace::
 | |
| 
 | |
|     items = [
 | |
|         'this is the first', 'set of items', 'with more items',
 | |
|         'to come in this line', 'like this'
 | |
|     ]
 | |
| 
 | |
| Blank lines:
 | |
|   Top level functions and classes are separated by two lines, everything
 | |
|   else by one.  Do not use too many blank lines to separate logical
 | |
|   segments in code.  Example::
 | |
| 
 | |
|     def hello(name):
 | |
|         print 'Hello %s!' % name
 | |
| 
 | |
| 
 | |
|     def goodbye(name):
 | |
|         print 'See you %s.' % name
 | |
| 
 | |
| 
 | |
|     class MyClass(object):
 | |
|         """This is a simple docstring"""
 | |
| 
 | |
|         def __init__(self, name):
 | |
|             self.name = name
 | |
| 
 | |
|         def get_annoying_name(self):
 | |
|             return self.name.upper() + '!!!!111'
 | |
| 
 | |
| Expressions and Statements
 | |
| --------------------------
 | |
| 
 | |
| General whitespace rules:
 | |
|   - No whitespace for unary operators that are not words
 | |
|     (e.g.: ``-``, ``~`` etc.) as well on the inner side of parentheses.
 | |
|   - Whitespace is placed between binary operators.
 | |
| 
 | |
|   Good::
 | |
| 
 | |
|     exp = -1.05
 | |
|     value = (item_value / item_count) * offset / exp
 | |
|     value = my_list[index]
 | |
|     value = my_dict['key']
 | |
| 
 | |
|   Bad::
 | |
| 
 | |
|     exp = - 1.05
 | |
|     value = ( item_value / item_count ) * offset / exp
 | |
|     value = (item_value/item_count)*offset/exp
 | |
|     value=( item_value/item_count ) * offset/exp
 | |
|     value = my_list[ index ]
 | |
|     value = my_dict ['key']
 | |
| 
 | |
| Yoda statements are a no-go:
 | |
|   Never compare constant with variable, always variable with constant:
 | |
| 
 | |
|   Good::
 | |
| 
 | |
|     if method == 'md5':
 | |
|         pass
 | |
| 
 | |
|   Bad::
 | |
| 
 | |
|     if 'md5' == method:
 | |
|         pass
 | |
| 
 | |
| Comparisons:
 | |
|   - against arbitrary types: ``==`` and ``!=``
 | |
|   - against singletons with ``is`` and ``is not`` (eg: ``foo is not
 | |
|     None``)
 | |
|   - never compare something with ``True`` or ``False`` (for example never
 | |
|     do ``foo == False``, do ``not foo`` instead)
 | |
| 
 | |
| Negated containment checks:
 | |
|   use ``foo not in bar`` instead of ``not foo in bar``
 | |
| 
 | |
| Instance checks:
 | |
|   ``isinstance(a, C)`` instead of ``type(A) is C``, but try to avoid
 | |
|   instance checks in general.  Check for features.
 | |
| 
 | |
| 
 | |
| Naming Conventions
 | |
| ------------------
 | |
| 
 | |
| - Class names: ``CamelCase``, with acronyms kept uppercase (``HTTPWriter``
 | |
|   and not ``HttpWriter``)
 | |
| - Variable names: ``lowercase_with_underscores``
 | |
| - Method and function names: ``lowercase_with_underscores``
 | |
| - Constants: ``UPPERCASE_WITH_UNDERSCORES``
 | |
| - precompiled regular expressions: ``name_re``
 | |
| 
 | |
| Protected members are prefixed with a single underscore.  Double
 | |
| underscores are reserved for mixin classes.
 | |
| 
 | |
| On classes with keywords, trailing underscores are appended.  Clashes with
 | |
| builtins are allowed and **must not** be resolved by appending an
 | |
| underline to the variable name.  If the function needs to access a
 | |
| shadowed builtin, rebind the builtin to a different name instead.
 | |
| 
 | |
| Function and method arguments:
 | |
|   - class methods: ``cls`` as first parameter
 | |
|   - instance methods: ``self`` as first parameter
 | |
|   - lambdas for properties might have the first parameter replaced
 | |
|     with ``x`` like in ``display_name = property(lambda x: x.real_name
 | |
|     or x.username)``
 | |
| 
 | |
| 
 | |
| Docstrings
 | |
| ----------
 | |
| 
 | |
| Docstring conventions:
 | |
|   All docstrings are formatted with reStructuredText as understood by
 | |
|   Sphinx.  Depending on the number of lines in the docstring, they are
 | |
|   laid out differently.  If it's just one line, the closing triple
 | |
|   quote is on the same line as the opening, otherwise the text is on
 | |
|   the same line as the opening quote and the triple quote that closes
 | |
|   the string on its own line::
 | |
| 
 | |
|     def foo():
 | |
|         """This is a simple docstring"""
 | |
| 
 | |
| 
 | |
|     def bar():
 | |
|         """This is a longer docstring with so much information in there
 | |
|         that it spans three lines.  In this case the closing triple quote
 | |
|         is on its own line.
 | |
|         """
 | |
| 
 | |
| Module header:
 | |
|   The module header consists of an utf-8 encoding declaration (if non
 | |
|   ASCII letters are used, but it is recommended all the time) and a
 | |
|   standard docstring::
 | |
| 
 | |
|     # -*- coding: utf-8 -*-
 | |
|     """
 | |
|         package.module
 | |
|         ~~~~~~~~~~~~~~
 | |
| 
 | |
|         A brief description goes here.
 | |
| 
 | |
|         :copyright: (c) YEAR by AUTHOR.
 | |
|         :license: LICENSE_NAME, see LICENSE_FILE for more details.
 | |
|     """
 | |
| 
 | |
|   Please keep in mind that proper copyrights and license files are a
 | |
|   requirement for approved Flask extensions.
 | |
| 
 | |
| 
 | |
| Comments
 | |
| --------
 | |
| 
 | |
| Rules for comments are similar to docstrings.  Both are formatted with
 | |
| reStructuredText.  If a comment is used to document an attribute, put a
 | |
| colon after the opening pound sign (``#``)::
 | |
| 
 | |
|     class User(object):
 | |
|         #: the name of the user as unicode string
 | |
|         name = Column(String)
 | |
|         #: the sha1 hash of the password + inline salt
 | |
|         pw_hash = Column(String)
 |