Python Code Style GuideLine
============================
总体布局
--------------
* 遵循 :pep:`8`
* 缩进:
4个空格
* 单行最大字数:
79个字符
* 长语句:
用反斜杠`\`来断句, 和最后一个`.`, `=` 或者以4个空格缩进
.. code-block:: python
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)
如果断句的语句中有括号和逗号, 和括号对齐
.. code-block:: python
this_is_a_very_long(function_call, 'with many parameters',
23, 42, 'and even more')
对于长列表(lists)或者元组(tuples), 在中括号和逗号后断句::
items = [
'this is the first', 'set of items', 'with more items',
'to come in this line', 'like this'
]
* 空行:
全局方法和类都用两行空行来分隔,其他都用一行。::
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'
表达式和语句
-------------
* 一般空格原则
- 一元运算符以及括号内侧不用空格 (e.g.: ``-``, ``~`` etc.)
- 二元运算符号使用空格
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']
* 不要用常量与变量做比较, 通常是变量与常量做比较
Good::
if method == 'md5':
pass
Bad::
if 'md5' == method:
pass
* 比较
- 比较任意类型: ``==`` 和 ``!=``
- 对于单个变量用 ``is`` 和 ``is not`` (eg: ``foo is not
None``)
- 不要用 `True` 或者 `False` 来比较(比如不要 ``foo == False``,
应该用 ``not foo``)
* 是否包含检查:
用 ``foo not in bar`` 来代替 ``not foo in bar``
* 实例检查:
用 ``isinstance(a, C)`` 来代替 ``type(A) is C``, 但是一般应该避免实例检查
命名约定
----------
- 类名: ``CamelCase``, 缩写词保持大写 (``HTTPWriter`` 而不是 ``HttpWriter``)
- 变量名: ``lowercase_with_underscores``
- 方法和函数名: ``lowercase_with_underscores``
- 常量名: ``UPPERCASE_WITH_UNDERSCORES``
- 预先编译的正则表达式: ``name_re``
"单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;
"双下划线" 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。
函数和方法的参数:
- 类方法: ``cls`` 为第一个参数
- 实例方法: ``self`` 为第一个参数
- 属性中的 `lambdas` 表达式第一个参数替代 ``x``
像 ``display_name = property(lambda x: x.real_name or x.username)``
文档字符串
----------
格式: reStructuredText
用三引号引起来::
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.
"""
模块头包含一个uf8 encoding的声明和一个标准的文档字符串::
# -*- coding: utf-8 -*-
"""
package.module
~~~~~~~~~~~~~~
A brief description goes here.
"""
注释
--------
::
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)
Links
------
- `PEP8 `_ Style Guide for Python Code
- `Flask Styleguide `_
- `Google Python Style Guide `_