摘要:原文介紹這篇文檔給出了語言編碼的風(fēng)格約定,包括中用實(shí)現(xiàn)的部分。譯者注不清楚這里是什么意思,括號(hào)中原文為語言版本使用標(biāo)準(zhǔn)年版本。這意味著在許多其他事情中所有聲明必須放在某個(gè)塊的頂部并不一定是函數(shù)的頂部。
介紹原文http://legacy.python.org/dev/peps/pep-0007/
這篇文檔給出了C語言編碼的風(fēng)格約定,包括Python中用C實(shí)現(xiàn)的部分。關(guān)于Python編碼風(fēng)格的約定,請(qǐng)參閱PEP-8 [1]
注意,有些約定并不一定要恪守。下面是打破約定的兩個(gè)很好的理由:
某個(gè)約定使得代碼難以閱讀,即使是對(duì)于那些習(xí)慣于閱讀風(fēng)格良好的代碼的人。
某個(gè)約定使得新增代碼與已有代碼不一致(可能是歷史原因?qū)е碌模1M管這也是一個(gè)清理別人糟糕代碼的好機(jī)會(huì)(用真正的XP風(fēng)格)。[譯者注:不清楚這里XP是什么意思,括號(hào)中原文為 in true XP style]
C語言版本使用ISO/ANSI標(biāo)準(zhǔn)C(1989年版本)。這意味著(在許多其他事情中)所有聲明必須放在某個(gè)塊的頂部(并不一定是函數(shù)的頂部)。
不使用gcc的擴(kuò)展(例,多行字符串不能不加反斜杠)。
所有函數(shù)聲明和定義必須使用完整的原型(即,明確寫出所有參數(shù)的類型)
不使用C++風(fēng)格的//單行注釋
對(duì)于主流的編譯器(如gcc, VC++等),編譯時(shí)不能有警告
代碼布局使用4個(gè)空格作為縮進(jìn),不使用tab
每行不超過79個(gè)字符。如果這和上一條規(guī)則讓你沒有空間去編碼,那你的代碼太復(fù)雜了 -- 考慮寫成子程序
每行都不應(yīng)該以空格結(jié)尾。如果你認(rèn)為你的代碼中有一些行末的空格很重要,再想想吧 -- 別人的編輯器可能會(huì)自動(dòng)刪掉它們。
函數(shù)定義風(fēng)格:函數(shù)名寫在行首,最外部的大括號(hào)寫在行首,聲明局部變量后空一行。
cstatic 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; }
代碼結(jié)構(gòu):在if for等關(guān)鍵詞與括號(hào)之間要有一個(gè)空格;在括號(hào)內(nèi)部不要有空格;在C允許的時(shí)候,大括號(hào)可以不寫,但如果寫了大括號(hào),它們應(yīng)該是這樣的:
cif (mro != NULL) { ... } else { ... }
返回語句中不要有多余的括號(hào)
creturn Py_None; /* correct */ return(Py_None); /* incorrect */
函數(shù)或宏的調(diào)用風(fēng)格foo(a, b, c) -- 函數(shù)名和左括號(hào)之間沒有空格,括號(hào)內(nèi)部沒有空格,逗號(hào)左邊沒有空格,每個(gè)逗號(hào)右邊有一個(gè)空格
總是在賦值、布爾運(yùn)算符、比較運(yùn)算符的兩邊加上空格。在有許多運(yùn)算符的表達(dá)式中,在最外部(最低優(yōu)先級(jí))的運(yùn)算符兩邊加上空格
很長(zhǎng)的行應(yīng)該被折行:如果可以,在第一個(gè)參數(shù)的逗號(hào)后開始折行。總是合適地縮進(jìn)剩下的行,例如:
cPyErr_Format(PyExc_TypeError, "cannot create "%.100s" instances", type->tp_name);
當(dāng)你對(duì)一個(gè)長(zhǎng)的表達(dá)式進(jìn)行折行的時(shí)候,運(yùn)算符總是在上一行的最末尾:
cif (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 */
在函數(shù)、結(jié)構(gòu)的定義、函數(shù)中的功能塊上下都加上空行
先寫注釋,再寫代碼
所有函數(shù)和全局變量必須被聲明為static,除非它們是發(fā)布了的或即將發(fā)布的接口
對(duì)于所有外部變量和函數(shù),我們總是在一個(gè)合適的頭文件中聲明它,這使用了PyAPI_FUNC()宏,例如:
cPyAPI_FUNC(PyObject *) PyObject_Repr(PyObject *);命名約定
對(duì)于公共的函數(shù),用Py作為前綴,這不能被用在內(nèi)部函數(shù)上。而Py_這個(gè)前綴是留給全局服務(wù)程序的如Py_FatalError。而特定的程序組(某個(gè)類型的接口)會(huì)用更長(zhǎng)的前綴,例如PyString_是字符串函數(shù)的前綴。
公共的函數(shù)和變量使用混合大小寫以及下劃線的命名規(guī)則,如PyObject_GetAttr Py_BuildValue PyExc_TypeError
有時(shí)候加載器需要知道一個(gè)內(nèi)部函數(shù)的名字,那這個(gè)內(nèi)部函數(shù)的名字以下劃線開頭,如_PyObject_Dump
宏應(yīng)該使用混合大小寫的前綴,然后全部大寫,如PyString_AS_STRING Py_PRINT_RAW
文檔字符串
使用PyDoc_STR()或PyDoc_STRVAR()這兩個(gè)宏來支持構(gòu)建沒有文檔字符串的Python(./configure --without-doc-strings)
對(duì)于那些需要支持Python 2.3以上的C代碼,你可以在includePython.h后再include這個(gè):
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
每條文檔字符串的第一行應(yīng)該是一個(gè)對(duì)參數(shù)和返回值給出摘要的“簽名”,例如:
cPyDoc_STRVAR(myfunction__doc__, "myfunction(name, value) -> bool Determine whether name and value make a valid pair.");
在“簽名”行和下面的描述行之間總是要有空行
如果返回值總是None(因?yàn)闆]有有意義的返回值),不要包括對(duì)返回值的推斷
寫多行文檔字符串時(shí),確保使用反斜杠,比如上面那個(gè)例子,或者是用字符串字面連接,如下:
cPyDoc_STRVAR(myfunction__doc__, "myfunction(name, value) -> bool " "Determine whether name and value make a valid pair.");
盡管一些編譯器也接受下面這種:
c/* BAD -- don"t do this! */ PyDoc_STRVAR(myfunction__doc__, "myfunction(name, value) -> bool Determine whether name and value make a valid pair.");
但不是所有的編譯器都接受。比如MSVC的編譯器就會(huì)抱怨這種。
參考[1] PEP 8, "Style Guide for Python Code", van Rossum, Warsaw (http://www.python.org/dev/peps/pep-0008)
版權(quán)This document has been placed in the public domain.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/37456.html
摘要:如果需要在二元運(yùn)算符周圍做換行操作,例如和,那么需要將換行操作放在前面,這條規(guī)則源于數(shù)學(xué),數(shù)學(xué)家同意在二元運(yùn)算符之前換行以可提高可讀性,比較以下兩個(gè)例子。在二元運(yùn)算符之前換行可以讓代碼更加具有可讀性,所鼓勵(lì)這種方式。 原文地址:How to Write Beautiful Python Code With PEP 8 作者:Jasmine Finer 翻譯:howie6879 ...
摘要:或許你是一個(gè)初入門的小白,完全不知道是什么。到目前為止,它擁有個(gè)兄弟姐妹。此外,關(guān)于對(duì)的貢獻(xiàn),還有一種很有效的方式,就是將翻譯成中文,造福國(guó)內(nèi)的學(xué)習(xí)社區(qū)。 或許你是一個(gè)初入門Python的小白,完全不知道PEP是什么。又或許你是個(gè)學(xué)會(huì)了Python的熟手,見過幾個(gè)PEP,卻不知道這玩意背后是什么。那正好,本文將系統(tǒng)性地介紹一下PEP,與大家一起加深對(duì)PEP的了解。 目前,國(guó)內(nèi)各類教程不...
摘要:課程簡(jiǎn)介簡(jiǎn)明易懂的課程,不僅適用于那些有其它語言基礎(chǔ)的同學(xué),對(duì)沒有編程經(jīng)驗(yàn)的同學(xué)也非常友好。建議遵守以下約定使用個(gè)空格來縮進(jìn)永遠(yuǎn)不要混用空格和制表符在函數(shù)之間空一行在類之間空兩行字典,列表,元組以及參數(shù)列表中,在后添加一個(gè)空格。 showImg(https://segmentfault.com/img/bVCldE); 課程簡(jiǎn)介:簡(jiǎn)明易懂的 Python3 課程,不僅適用于那些有其它語...
閱讀 2312·2021-09-26 10:21
閱讀 2785·2021-09-08 09:36
閱讀 3065·2019-08-30 15:56
閱讀 954·2019-08-30 12:57
閱讀 916·2019-08-26 10:39
閱讀 3554·2019-08-23 18:11
閱讀 3077·2019-08-23 17:12
閱讀 1070·2019-08-23 12:18