<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      說說Python編碼規范

      前言

              已有近兩個月沒有發表過文章了,前段時間外甥和女兒過來這邊渡暑假,平常晚上和周末時間都陪著她們了,趁這個周末有空,再抽空再把這塊拾起來。
               這么久沒寫了,再次拿起鍵盤,想想,發表些什么呢,想起上次公司的代碼評審委員會下周其中一個議題是關于Python編碼規范的整理,那就趁熱打鐵,整理一份關于Python編碼規范的文章,也為那些寫Python的人,提供一些編碼注意的一些事項或者說是參考吧。

      編碼規范的作用

              規范故明思義,就是通過不斷的總結,吸取好的點,從而形成的一份大家共同需要遵守的行為契約,
      網上有很多版本的編碼規范,基本上都是遵循 PEP8 的規范。那么什么是PEP8呢?
              PEP是 Python Enhancement Proposal 的縮寫,簡單來說,是python增強建議書的意思。它描述了Python編程風格的方方面面。在遵守這個文檔的條件下,不同程序員編寫的Python代碼可以保持最大程度的相似風格。
      這樣就易于閱讀,易于在程序員之間交流。


      下面就說說Python編碼時,應該遵守的編碼規范有哪些。

      編碼需遵守的規范

      編碼

      • 所有的 Python 腳本文件都應在文件頭標上如下標識或其兼容格式的標識: # -- coding:utf-8 --

      分號

      • 不要在行尾加分號, 也不要用分號將兩條命令放在同一行。

      換行

      • 常規下,每一行代碼控制在 80 字符以內

      • 以下情況除外:

        • 長的導入模塊語句

        • 注釋里的URL

      • 使用 \ 或 () 控制換行,舉例:

          def foo(first, second, third, fourth, fifth,
                  sixth, and_some_other_very_long_param):
              user = User.objects.filter_by(first=first, second=second, third=third) \
                  .skip(100).limit(100) \
                  .all()
        
          text = ('Long strings can be made up ''of several shorter strings.')

         

        如果行長到連第一個括號內的參數都放不下,則每個元素都單獨占一行:
      • 折疊長行的首選方法是使用Python支持的圓括號、方括號(brackets)和花括號(braces)內的行延續。但是有時也可以適當使用反斜杠 \ 。

      括號

      • 寧缺毋濫的使用括號

      • 除非是用于實現行連接, 否則不要在返回語句或條件語句中使用括號. 不過在元組兩邊使用括號是可以的.

          推薦: if foo:
                   bar()while x:
                   x = bar()if x and y:
                   bar()if not x:
                   bar()return foo         for (x, y) in dict.items(): ..
          不推薦:  if (x):
                   bar()if not(x):
                   bar()return (foo)
       

      縮進

      • 用4個空格來縮進代碼

      • 絕對不要用tab, 也不要tab和空格混用,否則容易出現 IndentationError

      • 使用任何編輯器寫 Python,請把一個 tab 展開為 4 個空格

      空行

      • 頂級定義之間空兩行, 比如函數或者類定義. 方法定義, 類定義與第一個方法之間, 都應該空一行. 函數或方法中, 某些地方要是你覺得合適, 就空一行.

      • function 和 class 頂上兩個空行

      • class 的 method 之間一個空行

      • 函數內邏輯無關的段落之間空一行,不要過度使用空行

      • 不要把多個語句寫在一行,然后用 ; 隔開

      • if/for/while 語句中,即使執行語句只有一句,也要另起一行

      • 在類、函數的定義間加空行;

      • 在import不同種類的模塊間加空行;

      • 在函數中的邏輯段落間加空行,即把相關的代碼緊湊寫在一起,作為一個邏輯段落,段落間以空行分隔;

      空格

      • 總體原則,避免不必要的空格。

      • 各種右括號前不要加空格。

      • 函數的左括號前不要加空格。如Func(1)。

      • 序列的左括號前不要加空格。如list[2]。

      • 操作符左右各加一個空格,不要為了對齊增加空格。

      • 函數默認參數使用的賦值符左右省略空格。

      • 不要將多句語句寫在同一行,盡管使用‘;’允許。

      • if/for/while語句中,即使執行語句只有一句,也必須另起一行。

      • 在二元算術、邏輯運算符前后加空格如:a = b + c

      • 在 list, dict, tuple, set, 參數列表的 , 后面加一個空格

      • 在 dict 的 : 后面加一個空格

      • 在注釋符號 # 后面加一個空格,但是 #!/usr/bin/python 的 # 后不能有空格

      • 操作符兩端加一個空格,如 +, -, *, /, |, &, =

      • 接上一條,在參數列表里的 = 兩端不需要空格

      • 括號((), {}, [])內的兩端不需要空格

      • 括號內不要有空格.

      • 不要在逗號, 分號, 冒號前面加空格, 但應該在它們后面加(除了在行尾).

          推薦: if x == 4:print x, y
               x, y = y, x
          不推薦:  if x == 4 :print x , y
           x , y = y , x

       

      • 在二元操作符兩邊都加上一個空格, 比如賦值(=), 比較(==, <, >, !=, <>, <=, >=, in, not in, is, is not), 布爾(and, or, not). 至于算術操作符兩邊的空格該如何使用, 需要你自己好好判斷. 不過兩側務必要保持一致.

          推薦: x == 1
          不推薦:  x<1

       

      • 當’=’用于指示關鍵字參數或默認參數值時, 不要在其兩側使用空格.

          推薦: def complex(real, imag=0.0): return magic(r=real, i=imag)
          不推薦:  def complex(real, imag = 0.0): return magic(r = real, i = imag)

         

      • 不要用空格來垂直對齊多行間的標記, 因為這會成為維護的負擔(適用于:, #, =等):

          推薦:
               foo = 1000  # 注釋
               long_name = 2  # 注釋不需要對齊
      
               dictionary = {"foo": 1,"long_name": 2,}
          不推薦:
               foo       = 1000  # 注釋
               long_name = 2     # 注釋不需要對齊
      
               dictionary = {"foo"      : 1,"long_name": 2,}

       

      Shebang

      • 大部分.py文件不必以#!作為文件的開始

      • 程序的main文件應該以 #!/usr/bin/python2或者 #!/usr/bin/python3開始.

       

      補充知識: 此處解釋一下何為Shebang,Shebang就是
      是一個由井號和嘆號構成的字符串行(#!), 其出現在文本文件的第一行的前兩個字符. 在文件中存在Shebang的情況下,
      類Unix操作系統的程序載入器會分析Shebang后的內容, 將這些內容作為解釋器指令, 并調用該指令,
      并將載有Shebang的文件路徑作為該解釋器的參數. 例如, 以指令#!/bin/sh開頭的文件在執行時會實際調用/bin/sh程序.)#!先用于幫助內核找到Python解釋器, 但是在導入模塊時, 將會被忽略. 因此只有被直接執行的文件中才有必要加入#!

      注釋

      • 為了提高可讀性, 塊注釋和行注釋注釋應該至少離開代碼2個空格.

      • 塊注釋,在一段代碼前增加的注釋。在‘#’后加一空格。段落之間以只有‘#’的行間隔。比如:

          # Description : Module config.
          # 
          # Input : None
          #
          # Output : None

         

      • 行注釋,在一句代碼后加注釋。比如:x = x + 1            # Increment x

      • 為所有的共有模塊、函數、類、方法寫docstrings;非共有的沒有必要,但是可以寫注釋(在def的下一行)。

      • 如果docstring要換行

          """Return a foobang
        
          Optional plotz says to frobnicate the bizbaz first.
        
          """

         

      • 文檔字符串 docstring, 是 package, module, class, method, function 級別的注釋,可以通過doc 成員訪問到,注釋內容在一對 “”” 符號之間

      • function, method 的文檔字符串應當描述其功能、輸入參數、返回值,如果有復雜的算法和實現,也需要寫清楚

      • 優先使用英文寫注釋,英文不好全部寫中文,否則更加看不懂

      • 注釋塊:注釋塊通常應用于跟隨其后的一些 (或者全部) 代碼,并和這些代碼有著相同的縮進 層次。注釋塊中每行以 ‘#’ 和一個空格開始 (除非它是注釋內的縮進文本)。
        注釋塊內的段落以僅含單個 ‘#’ 的行分割

      • 行內注釋:一個行內注釋是和語句在同一行的注釋。行內注釋應該至少用兩個空格和語句分開。 它們應該以一個 ‘#’ 和單個空格開始。

      異常

      • 不要輕易使用 try/except

      • except 后面需要指定捕捉的異常,裸露的 except 會捕捉所有異常,意味著會隱藏潛在的問題

      • 可以有多個 except 語句,捕捉多種異常,分別做異常處理

      • 使用 finally 子句來處理一些收尾操作

      • try/except 里的內容不要太多,只在可能拋出異常的地方使用

      • 從 Exception 而不是 BaseException 繼承自定義的異常類

      Class(類)

      • 使用 super 調用父類的方法

      • 支持多繼承,即同時有多個父類,建議使用 Mixin

      • 如果一個類不繼承自其它類, 就顯式的從object繼承. 嵌套類也一樣.

          
      推薦: 
          class SampleClass(object):
              pass
          class OuterClass(object):
              pass
          class InnerClass(object):
              pass
      
          class ChildClass(ParentClass):
          """Explicitly inherits from another class already."""
              pass
          不推薦: 
          class SampleClass:
              pass
          class OuterClass:
              pass   
          class InnerClass:
              pass

       

      這是繼承自 object 是為了使屬性(properties)正常工作, 并且這樣可以保護你的代碼, 使其不受Python 3000的一個特殊的潛在不兼容性影響. 這樣做也定義了一些特殊的方法, 這些方法實現了對象的默認語義, 包括 newinitdelattrgetattributesetattrhashrepr, and str .

      引號

      • 在同一個文件中, 保持使用字符串引號的一致性. 使用單引號’或者雙引號”之一用以引用字符串, 并在同一文件中沿用. 在字符串內可以使用另外一種引號,

      • 為多行字符串使用三重雙引號”””而非三重單引號’’’. 當且僅當項目中使用單引號’來引用字符串時, 才可能會使用三重’’’為非文檔字符串的多行字符串來標識引用. 文檔字符串必須使用三重雙引號”””. 不過要注意, 通常用隱式行連接更清晰, 因為多行字符串與程序其他部分的縮進方式不一致.

      文件和sockets

      • 在文件和sockets結束時, 顯式的關閉它.

      • 推薦使用 “with”語句 以管理文件:

         with open("hello.txt") as hello_file:     
             for line in hello_file:         
                 print line    

         

      • 對于不支持使用”with”語句的類似文件的對象,使用 contextlib.closing():

          import contextlib  with contextlib.closing(urllib.urlopen("http://www.python.org/")) as front_page:      
            for line in front_page:         
                 print line    

         

      TODO注釋

      • TODO注釋應該在所有開頭處包含”TODO”字符串, 緊跟著是用括號括起來的你的名字, email地址或其它標識符. 然后是一個可選的冒號. 接著必須有一行注釋, 解釋要做什么

      • 如果你的TODO是”將來做某事”的形式, 那么請確保你包含了一個指定的日期(“2009年11月解決”)或者一個特定的事件(“等到所有的客戶都可以處理XML請求就移除這些代碼”)

      import導入格式

            • 每個導入應該獨占一行

                推薦: import os       
                  import sys
                from flask import Flask, render_template, jsonify
              不推薦: import os, sys 

               

      • 導入總應該放在文件頂部, 位于模塊注釋和文檔字符串之后, 模塊全局變量和常量之前. 導入應該按照從最通用到最不通用的順序分組:

        • 標準庫導入

        • 第三方庫導入

        • 應用程序指定導入

      • 所有 import 盡量放在文件開頭,在 docstring 下面,其他變量定義的上面

      • 不要使用 from foo imort *

      • 為了避免可能出現的命名沖突,可以使用 as 或導入上一級命名空間

      • 不要出現循環導入(cyclic import)

      命名

      命名參考形式:
      module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_VAR_NAME, instance_var_name, function_parameter_name, local_var_name.

      • 應該避免的名稱

        • 單字符名稱, 除了計數器和迭代器.

        • 包/模塊名中的連字符(-)

        • 雙下劃線開頭并結尾的名稱(Python保留, 例如init)

      • 命名約定

        • 所謂”內部(Internal)”表示僅模塊內可用, 或者, 在類內是保護或私有的.

        • 用單下劃線(_)開頭表示模塊變量或函數是protected的(使用import * from時不會包含).

        • 用雙下劃線(__)開頭的實例變量或方法表示類內私有.

        • 將相關的類和頂級函數放在同一個模塊里. 不像Java, 沒必要限制一個類一個模塊.

        • 對類名使用大寫字母開頭的單詞(如CapWords, 即Pascal風格), 但是模塊名應該用小寫加下劃線的方式(如lower_with_under.py). 盡管已經有很多現存的模塊使用類似于CapWords.py這樣的命名, 但現在已經不鼓勵這樣做, 因為如果模塊名碰巧和類名一致, 這會讓人困擾.

      • 盡量單獨使用小寫字母‘l’,大寫字母‘O’等容易混淆的字母。

      • 模塊命名盡量短小,使用全部小寫的方式,可以使用下劃線。

      • 包命名盡量短小,使用全部小寫的方式。

      • 類的命名使用CapWords的方式,模塊內部使用的類采用_CapWords的方式。

      • 異常命名使用CapWords+Error后綴的方式。

      • 全局變量盡量只在模塊內有效,類似C語言中的static。實現方法有兩種,一是all機制;二是前綴一個下劃線。

      • 函數命名使用全部小寫的方式,可以使用下劃線。

      • 常量命名使用全部大寫的方式,可以使用下劃線。

      • 類的屬性(方法和變量)命名使用全部小寫的方式,可以使用下劃線。

      • 類的屬性有3種作用域public、non-public和subclass API,可以理解成C++中的public、private、protected,non-public屬性前,前綴一條下劃線。

      • 類的屬性若與關鍵字名字沖突,后綴一下劃線,盡量不要使用縮略等其他方式。

      • 為避免與子類屬性命名沖突,在類的一些屬性前,前綴兩條下劃線。比如:類Foo中聲明a,訪問時,只能通過Foo._Fooa,避免歧義。如果子類也叫Foo,那就無能為力了。

      • 類的方法第一個參數必須是self,而靜態方法第一個參數必須是cls。

      • 使用有意義的,英文單詞或詞組,絕對不要使用漢語拼音

      • package/module 名中不要出現 -

      Main方法

      • 所有的頂級代碼在模塊導入時都會被執行. 要小心不要去調用函數, 創建對象, 或者執行那些不應該在使用pydoc時執行的操作.

      字符串

      • 使用字符串的 join 方法拼接字符串

      • 使用字符串類型的方法,而不是 string 模塊的方法

      • 使用 startswith 和 endswith 方法比較前綴和后綴

      • 使用 format 方法格式化字符串

      比較

      • 空的 list, str, tuple, set, dict 和 0, 0.0, None 都是 False

      • 使用 if some_list 而不是 if len(some_list) 判斷某個 list 是否為空,其他類型同理

      • 使用 is 和 is not 與單例(如 None)進行比較,而不是用 == 和 !=

      • 使用 if a is not None 而不是 if not a is None

      • 用 isinstance 而不是 type 判斷類型

      • 不要用 == 和 != 與 True 和 False 比較(除非有特殊情況,如在 sqlalchemy 中可能用到)

      • 使用 in 操作:

      • 用 key in dict 而不是 dict.has_key()

          不推薦 if d.has_key(k):
          do_something()
        
          推薦 if key in d:
          do_something()

         

      • 用 set 加速 “存在性” 檢查,list 的查找是線性的,復雜度 O(n),set 底層是 hash table, 復雜度 O(1),但用 set 需要比 list 更多內存空間

      代碼編排

      • 縮進。4個空格的縮進(編輯器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。

      • 每行最大長度79,換行可以使用反斜杠,最好使用圓括號。換行點要在操作符的后邊敲回車。

      • 類和top-level函數定義之間空兩行;類中的方法定義之間空一行;函數內邏輯無關段落之間空一行;其他地方盡量不要再空行。

      文檔編排

      • 模塊內容的順序:模塊說明和docstring—import—globals&constants—其他定義。其中import部分,又按標準、三方和自己編寫順序依次排放,之間空一行。

      • 不要在一句import中多個庫,比如import os, sys不推薦。

      • 如果采用from XX import XX引用庫,可以省略‘module.’,都是可能出現命名沖突,這時就要采用import XX

      編碼建議

      • 編碼中考慮到其他python實現的效率等問題,比如運算符‘+’在CPython(Python)中效率很高,都是Jython中卻非常低,所以應該采用.join()的方式。

      • 盡可能使用‘is’‘is not’取代‘==’,比如if x is not None 要優于if x。

      • 使用基于類的異常,每個模塊或包都有自己的異常類,此異常類繼承自Exception。

      • 異常中不要使用裸露的except,except后跟具體的exceptions。

      • 異常中try的代碼盡可能少。

      • 使用startswith() and endswith()代替切片進行序列前綴或后綴的檢查。比如:

        推薦:  if foo.startswith('bar'):
        不推薦:  if foo[:3] == 'bar':

         

      • 使用isinstance()比較對象的類型。比如

        推薦:  if isinstance(obj, int): 優于
        不推薦:  if type(obj) is type(1):

         

      • 判斷序列空或不空,有如下規則

        Yes:  if not seq:if seq:
        優于
        No:  if len(seq)if not len(seq)

         

      • 字符串不要以空格收尾。

      • 二進制數據判斷使用 if boolvalue的方式。

      • 使用列表表達式(list comprehension),字典表達式(dict comprehension, Python 2.7+) 和生成器(generator)

      • dict 的 get 方法可以指定默認值,但有些時候應該用 [] 操作,使得可以拋出 KeyError

      • 使用 for item in list 迭代 list, for index, item in enumerate(list) 迭代 list 并獲取下標

      • 使用內建函數 sorted 和 list.sort 進行排序

      • 適量使用 map, reduce, filter 和 lambda,使用內建的 all, any 處理多個條件的判斷

      • 使用裝飾器(decorator)

      • 使用 with 語句處理上下文

      • 使用 logging 記錄日志,配置好格式和級別

      • 閱讀優秀的開源代碼,如 Flask 框架, Requests

      • 不要重復造輪子,查看標準庫、PyPi、Github、Google 等使用現有的優秀的解決

       

       

      好了,時間也不早了,今天就到此為止吧,如果覺得本文對你有點用的話,就邀請身邊的人關注起吧~

      公眾號為:mikezhou_talk

       

       

      posted @ 2017-08-26 23:20  狂師  閱讀(1329)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 久久精品波多野结衣| 丁香五月亚洲综合在线国内自拍| 中文人妻AV高清一区二区| 92自拍视频爽啪在线观看| 无码国模国产在线观看免费| 久久蜜臀av一区三区| 久久精品亚洲精品国产色婷| 婷婷精品国产亚洲av在线观看| 国精品91人妻无码一区二区三区| 亚洲精品国产av成人网| 狠狠婷婷综合久久久久久| 玩弄放荡人妻少妇系列| 亚洲成人av免费一区| 亚洲欧美一区二区三区在线| 久久国产国内精品国语对白| 国产成人a在线观看视频免费| 丁香五月网久久综合| 亚洲国产欧美在线人成aaaa| 国产99视频精品免费专区| 少妇高潮惨叫喷水在线观看| 日韩av天堂综合网久久| 一区二区不卡国产精品| 一区二区三区人妻无码| 精品国产中文字幕在线看| 国产AV福利第一精品| 国产精品久久久一区二区| 亚洲人成人一区二区三区| 色天天天综合网色天天| 老熟妇高潮一区二区三区| 精品久久久久无码| 成人福利国产午夜AV免费不卡在线| 国产中文字幕精品免费| 国产亚洲精品成人aa片新蒲金| 亚洲中文字幕一区二区| 97超级碰碰碰碰久久久久| 精品久久久bbbb人妻| 成年在线观看免费人视频| 昌黎县| 丝袜无码一区二区三区| 在线观看精品日本一区二| 麻豆亚洲自偷拍精品日韩另|