原文http://legacy.python.org/dev/peps/pep-0007/
这篇文档给出了C语言编码的风格约定,包括Python中用C实现的部分。关于Python编码风格的约定,请参阅PEP-8 [1]
注意,有些约定并不一定要恪守。下面是打破约定的两个很好的理由:
//
单行注释函数定义风格:函数名写在行首,最外部的大括号写在行首,声明局部变量后空一行。
c
static int extra_ivars(PyTypeObject *type, PyTypeObject *base) { int t_size = PyType_BASICSIZE(type); int b_size = PyType_BASICSIZE(base); assert(t_size >= b_size); /* type smaller than base! */ ... return 1; }
代码结构:在if
for
等关键词与括号之间要有一个空格;在括号内部不要有空格;在C允许的时候,大括号可以不写,但如果写了大括号,它们应该是这样的:
c
if (mro != NULL) { ... } else { ... }
返回语句中不要有多余的括号
c
return Py_None; /* correct */ return(Py_None); /* incorrect */
foo(a, b, c)
— 函数名和左括号之间没有空格,括号内部没有空格,逗号左边没有空格,每个逗号右边有一个空格很长的行应该被折行:如果可以,在第一个参数的逗号后开始折行。总是合适地缩进剩下的行,例如:
c
PyErr_Format(PyExc_TypeError, \"cannot create \'%.100s\' instances\", type->tp_name);
当你对一个长的表达式进行折行的时候,运算符总是在上一行的最末尾:
c
if (type->tp_dictoffset != 0 && base->tp_dictoffset == 0 && type->tp_dictoffset == b_size && (size_t)t_size == b_size + sizeof(PyObject *)) return 0; /* \"Forgive\" adding a __dict__ only */
static
,除非它们是发布了的或即将发布的接口PyAPI_FUNC()
宏,例如:c
PyAPI_FUNC(PyObject *) PyObject_Repr(PyObject *);
Py
作为前缀,这不能被用在内部函数上。而Py_
这个前缀是留给全局服务程序的如Py_FatalError
。而特定的程序组(某个类型的接口)会用更长的前缀,例如PyString_
是字符串函数的前缀。PyObject_GetAttr
Py_BuildValue
PyExc_TypeError
_PyObject_Dump
PyString_AS_STRING
Py_PRINT_RAW
使用PyDoc_STR()
或PyDoc_STRVAR()
这两个宏来支持构建没有文档字符串的Python(./configure –without-doc-strings)
对于那些需要支持Python 2.3以上的C代码,你可以在includePython.h
后再include这个:
c
#ifndef PyDoc_STR #define PyDoc_VAR(name) static char name[] #define PyDoc_STR(str) (str) #define PyDoc_STRVAR(name, str) PyDoc_VAR(name) = PyDoc_STR(str) #endif
每条文档字符串的第一行应该是一个对参数和返回值给出摘要的“签名”,例如:
c
PyDoc_STRVAR(myfunction__doc__, \"myfunction(name, value) -> bool\\n\\n\\ Determine whether name and value make a valid pair.\");
在“签名”行和下面的描述行之间总是要有空行
如果返回值总是None
(因为没有有意义的返回值),不要包括对返回值的推断
写多行文档字符串时,确保使用反斜杠,比如上面那个例子,或者是用字符串字面连接,如下:
c
PyDoc_STRVAR(myfunction__doc__, \"myfunction(name, value) -> bool\\n\\n\" \"Determine whether name and value make a valid pair.\");
尽管一些编译器也接受下面这种:
c
/* BAD -- don\'t do this! */ PyDoc_STRVAR(myfunction__doc__, \"myfunction(name, value) -> bool\\n\\n Determine whether name and value make a valid pair.\");
但不是所有的编译器都接受。比如MSVC的编译器就会抱怨这种。
[1] PEP 8, \”Style Guide for Python Code\”, van Rossum, Warsaw (http://www.python.org/dev/peps/pep-0008)
This document has been placed in the public domain.