Python編碼規(guī)范

Python編碼規(guī)范

1 排版

1.1 Indentation縮進(jìn)

在參數(shù)過多時(shí)適當(dāng)縮進(jìn)

foo = long_function_name(var_one, var_two,
                         var_three, var_four)

def long_function_name(
    var_one, var_two, var_three,
    var_four):
print(var_one)

換行應(yīng)該使用同級(jí)的縮進(jìn)

Yes:

foo = long_function_name(
    var_one, var_two,
    var_three, var_four)

No:

foo = long_function_name(var_one, var_two,
    var_three, var_four)

Yes:

if (this_is_one_thing and
    that_is_another_thing):
    do_something()

注釋需要具有相同的縮進(jìn)

if (this_is_one_thing and
    that_is_another_thing):
    # Since both conditions are true, we can frobnicate.
    do_something()

以關(guān)系符開始應(yīng)該增加縮進(jìn)

if (this_is_one_thing
        and that_is_another_thing):
    do_something()

變量聲明中應(yīng)該有相同的縮進(jìn)

my_list = [
    1, 2, 3,
    4, 5, 6,
    ]
result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
    )

1.2 最大行長(zhǎng)

所有行最大長(zhǎng)度被限制在79個(gè)字符

with open('/path/to/some/file/you/want/to/read') as file_1,\
open('/path/to/some/file/being/written', 'w') as file_2:
    file_2.write(file_1.read())

過長(zhǎng)需要續(xù)行使用’\’二元操作符的位置

No: 操作符里操作數(shù)過遠(yuǎn)

income = (gross_wages +
          taxable_interest +
         (dividends - qualified_dividends) -
          ira_deduction -
          student_loan_interest)

Yes: 正確的方式可以更容易的去匹配操作符與操作數(shù)

income = (gross_wages
        + taxable_interest
        + (dividends - qualified_dividends)
        - ira_deduction
        - student_loan_interest)

1.3空行

  • 頂層函數(shù)和類定義:前后兩行空白
  • 類方法定義:前后一行空白
  • 應(yīng)該添加額外空行來曲分不同組的函數(shù)
  • 在函數(shù)定義內(nèi)部使用空行來分隔不同的邏輯片段
  • 源文件編碼:

Python2使用ASCII編碼或者Python3使用UTF-8編碼耽装,不應(yīng)該聲明編碼類型荆姆。
所以在使用Python2時(shí)墩划,我們應(yīng)該在源文件開始聲明編碼類型。
#coding=utf-8

1.4 Import引入

  • 引入模塊應(yīng)該分行

Yes:

import os       
import sys

No:

import sys, os

It's okay to say this though:

from subprocess import Popen, PIPE

引入聲明應(yīng)該總是在文件頂部洪鸭,僅在任何模塊的注釋和文檔字符后面佳头,同時(shí)也要處在全局變量和常量聲明之前娄柳。

引入應(yīng)該按照下面的順序分組并書寫

  1. 標(biāo)準(zhǔn)庫(kù)
  2. 相關(guān)第三方庫(kù)
  3. 本地 應(yīng)用/庫(kù) 特殊量的引入

你應(yīng)該用空行隔開每個(gè)分組

? 在用戶包/或者可引用的文件夾外的文檔內(nèi)import 模塊應(yīng)該使用絕對(duì)引用的方式

import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example

? 在用戶包內(nèi)import 模塊應(yīng)該使用相對(duì)引用的方式争拐,確保包內(nèi)路徑的可靠性

from . import sibling

從當(dāng)前目錄下引用

from .. import x

從當(dāng)前目錄上層文件夾引用

from .sibling import example

從當(dāng)前目錄下sibling層引用

標(biāo)準(zhǔn)庫(kù)應(yīng)當(dāng)總是絕對(duì)引用

應(yīng)當(dāng)盡量避免使用下面的引入方式:

from <module> import *

1.4 行內(nèi)注釋

  • 應(yīng)該保守的使用行內(nèi)注釋
  • 行內(nèi)注釋應(yīng)該至少與代碼間隔兩個(gè)空格
  • 應(yīng)避免無(wú)意義的注釋

如下

x = x + 1                 # Increment x

這樣會(huì)更有意義:

x = x + 1                 # Compensate for border

2. 命名要求

2.1 最重要的規(guī)則

作為為其他用戶開放的公共變量的名字必須遵循管理搀罢,而且能夠顯示它的用途

2.2 命名形式

有很多不同的命名方式蝗岖,下面的命名方式都是可以使用

  • b (single lowercase letter)
  • B (single uppercase letter)
  • lowercase
  • lower_case_with_underscores
  • UPPERCASE
  • UPPER_CASE_WITH_UNDERSCORES
  • CapitalizedWords (or CapWords, or CamelCase -- so named because of the bumpy look of its letters ). This is also sometimes known as StudlyCaps.

Note: 當(dāng)使用駝峰是命名的時(shí)候,應(yīng)當(dāng)將命名中的縮寫全部用大寫表示. 因此 HTTPServerError 要比HttpServerError更好榔至。
mixedCase (不同于CapitalizedWords在首字母的大小寫上)抵赢,

Capitalized_Words_With_Underscores (這是個(gè)很丑的方式)

  • 也可以使用一個(gè)獨(dú)特簡(jiǎn)短的前綴為一組相關(guān)的變量進(jìn)行命這在Python里使用的并不多。
  • 還需要補(bǔ)充說明的一些規(guī)則

_single_leading_underscore : 弱的內(nèi)部變量標(biāo)示. 當(dāng)使用語(yǔ)句
from M import *語(yǔ)句引入模塊時(shí)并不會(huì)引用以單個(gè)下劃線開頭的變量。

single_trailing_underscore_ : 使用后單個(gè)下劃線來避免變量名與python關(guān)鍵詞的沖突铅鲤,如:class_class划提。

__double_leading_underscore : 當(dāng)命名一個(gè)類屬性是,以雙下劃線開頭, 啟用命名矯正功能(在類FooBar內(nèi), __boo變成了_FooBar__boo)邢享。

double_leading_and_trailing_underscore : 以雙下劃綫開頭和結(jié)尾Python中可以重載的一些魔法方法鹏往。

E.g.__init__ , __import__ or __file__ . 不要去創(chuàng)造相似的名字。

3. 指定的: 命名規(guī)則

3.1 需要避免的命名

  • 永遠(yuǎn)不要使用字母'l' (小寫的字母L), 'O' (大寫字母的o), 或者 'I' (大寫字母的i) 作為單個(gè)字母的變量名骇塘。

3.2 包和模塊名

  • 模塊應(yīng)該用短的伊履,而且全是小寫字母的名字。

  • 使用下劃線分割款违,當(dāng)使用下劃線可以提高模塊命名的可讀性時(shí)唐瀑。

  • Python包應(yīng)該也使用短的,而且全小寫的名字插爹,并不推薦使用下劃線分割介褥。

  • 當(dāng)存在一個(gè)使用C或C++編寫的模塊,同時(shí)包含一個(gè)Python模塊為其提供高層封裝時(shí)递惋, C/C++ 模塊應(yīng)該用前下劃線開始(e.g. _socket )柔滔。

3.3 類命名

  • 類名通常應(yīng)該使用首字母大寫的命名規(guī)則(CapWords convention)。

  • 函數(shù)命名規(guī)則可以被使用當(dāng)接口被記錄在文檔中萍虽,同時(shí)主要用于隨時(shí)可以調(diào)用的函數(shù)
    The naming convention for functions may be used instead in cases where the interface is documented and used primarily as a callable.

  • 需要注意的是睛廊,對(duì)于內(nèi)建函數(shù)的命名,這里與一個(gè)不同的規(guī)則杉编,他們一般是單獨(dú)的一個(gè)單詞超全,又是是兩個(gè)單詞。

  • CapWords convention邓馒,僅僅用于異常名和內(nèi)建的常量

Note that there is a separate convention for builtin names: most builtin names are single words (or two words run together), with the CapWords convention used only for exception names and builtin constants.

3.4 類型變量名

  • 類型變量名通常應(yīng)該使用CapWords嘶朱,且更傾向于使用簡(jiǎn)短的名字,如: T光酣、 AnyStr疏遏、 Num等。相應(yīng)的救军,建議添加后綴_co或者 _contra給那些被用來聲明covariant或者contravariant 行為的變量财异。
    例子:from typing import TypeVar

      VT_co = TypeVar('VT_co', covariant=True)
      KT_contra = TypeVar('KT_contra'contravariant=True)
    

3.5 異常名

因?yàn)楫惓J且粋€(gè)類, 按照已經(jīng)提供的類命名方法來命名。你還需要在你的異常名后面添加"Error"后綴(如果它真的是一個(gè)錯(cuò)誤).

3.6 全局變量命名

  • (假設(shè)這些變量?jī)H僅在一個(gè)模塊內(nèi)部使用) 它們的命名規(guī)則和函數(shù)是一樣的唱遭。

  • 被設(shè)計(jì)成為使用from M import *語(yǔ)句來引入的模塊戳寸,應(yīng)該使用__all__機(jī)制 來防止引入全局量, 或者使用一個(gè)下劃線為前綴的舊命名規(guī)則為全局量命名(這樣就指明了這些全局量是非公開的)。

3.7 函數(shù)命名

函數(shù)名應(yīng)該是小寫,有必要為了提高可閱讀性可以使用下劃線將單詞分開拷泽。

mixedCase被允許使用疫鹊,僅僅是為了延續(xù)上文中使用的經(jīng)典命名方式(e.g. threading.py)來維持向前的兼容性

3.8 函數(shù)和方法參數(shù)

  • 總是使用self作為實(shí)例方法的第一個(gè)參數(shù)袖瞻。

  • 總是使用cls作為類方法的第一個(gè)參數(shù)。

  • 如果一個(gè)函數(shù)的參數(shù)的名字與保留字沖突拆吆,為其添加一個(gè)后下劃線要比縮寫或者污染這個(gè)變量名更好虏辫。因此class_要比clss好。 (可能更好的方法是使用同義詞來避免這樣的沖突锈拨。)

3.9 方法名和實(shí)例變量

  • 使用函數(shù)命名規(guī)則: 有必要小寫那些使用下劃線分隔的單詞砌庄,如果能夠提高可讀性。

  • 使用單個(gè)前下劃線來為非公開的方法和實(shí)例變量命名奕枢。

  • 為了避免和子類的命名沖突娄昆,使用兩個(gè)前下劃線來啟用Python的命名矯正功能。

    Python用類型名來矯正這些名字缝彬。如果類型Foo有一個(gè)屬性萌焰,命名為__a,使用Foo.__a并不能調(diào)用它。(堅(jiān)持的用戶仍然可以使用Foo._Foo__a來調(diào)用谷浅。) 通常雙下劃線應(yīng)該是用于被設(shè)計(jì)成可繼承的類扒俯,來避免類屬性與子類屬性的命名沖突。

注意: 對(duì)于__names的使用時(shí)存在一些爭(zhēng)議的(見下文)一疯。

3.10 常量

  • 常量一般定義于模塊層級(jí)撼玄,使用用下劃線分隔的全大寫字母來命名。

    Examples include MAX_OVERFLOW and TOTAL .

3.11 繼承的設(shè)計(jì)

  • 總是決定一個(gè)方法或者變量(均被稱為屬性)應(yīng)該是公開還是不公開的墩邀。如果存在疑問就選擇非公開掌猛。那么在未來將其變成公開的會(huì)比變成非公開的更簡(jiǎn)單。

  • 公開的屬性是那些你希望開放給不相關(guān)的客戶端來使用的屬性眉睹,你的恪守承諾可以讓這些不相關(guān)的使用者荔茬,消除向下不兼容的變化。非公開的屬性是指竹海,不會(huì)被第三方調(diào)用的屬性慕蔚。你不為非公開的屬性提供不變化或者不被移除的保證。

    我們不使用“private”這里斋配,是因?yàn)樵赑ython里沒有真正私有的變量(在不付出大量非必要的工作量下)孔飒。

  • 另一種范疇的屬性是那些“subclass API”(通常被聲明為“protected”在其他語(yǔ)言中)。有些類是設(shè)計(jì)成為被繼承的许起,不是去擴(kuò)展就是修改這些類的行為十偶。
    當(dāng)設(shè)計(jì)這樣的類時(shí),要仔細(xì)的去做出明確的決定园细,哪些屬性是公開的,哪些屬性是子類接口接校,哪些屬性是真的只被你的基類使用猛频。

有了這些考慮狮崩,下面是一些python化的指引:

  • 公開的屬性應(yīng)該沒有前下劃線。

  • 如果你的公開屬性名與保留字沖突鹿寻,在其名字尾部添加單下劃線睦柴。(但是, 盡管有這條規(guī)則,對(duì)于已知是一個(gè)類的任何變量或者參數(shù)毡熏,特別是類方法的第一個(gè)參數(shù)坦敌,cls都是一個(gè)更好的拼寫)

  • 對(duì)于簡(jiǎn)單的公開的數(shù)據(jù)屬性,最好僅僅暴露屬性名痢法,而不要存取器方法狱窘。記住Python對(duì)未來的增強(qiáng)提供簡(jiǎn)單的方式。如果你發(fā)現(xiàn)一個(gè)簡(jiǎn)單的數(shù)據(jù)需要去擴(kuò)展函數(shù)的行為财搁,在這種情況下蘸炸,使用內(nèi)置的“property”函數(shù)來隱藏簡(jiǎn)單數(shù)據(jù)在讀寫或者刪除時(shí),產(chǎn)生的其他行為尖奔。

Note 1: Property只工作于新式的類搭儒。

Note 2: Try to keep the functional behavior side-effect free, although side-effects such as caching are generally fine.

Note 3: 在計(jì)算密集型的操作中避免使用property的方法。

  • 如果你的類是被設(shè)計(jì)成為被繼承的提茁,同時(shí)淹禾,你有那些你不希望子類去使用的屬性,那么考慮使用前雙下劃線(不帶后下劃線)去命名它們茴扁。這觸發(fā)了Python的命名矯正算法稀拐,這時(shí),類名會(huì)被加入屬性名中丹弱。這對(duì)避免屬性名沖突德撬,當(dāng)子類并不是故意的包含哪些相同的名字。

Note 1: 注意只有簡(jiǎn)單的類命名被用于矯正命名躲胳。所以當(dāng)有一個(gè)子類選擇相同的類名和相同的屬性名蜓洪,你還是會(huì)有命名沖突。

Note 2: 命名矯正較不方便的用在確定的用途上坯苹,比如調(diào)試或者獲得屬性(getattr()方法)隆檀,盡管命名矯正算法已經(jīng)有了很好的文檔,也可以簡(jiǎn)單的手動(dòng)實(shí)施粹湃。

Note 3: 并不是每個(gè)人都喜歡命名矯正恐仑,試著去平衡的使用它來降低高級(jí)調(diào)用者潛在的使用中出現(xiàn)意外的命名沖突的可能性。

4. 公開和內(nèi)部接口

  • 只是對(duì)公開接口为鳄,保證向前的兼容性裳仆,所以使用者能夠清楚的判斷公開接口和內(nèi)部接口是很重要的。
  • 寫入文檔的接口被認(rèn)為是公開的孤钦,除非文檔明確說明歧斟,這些接口是臨時(shí)得或者內(nèi)部的纯丸,從而不在向前兼容的保證中。所有沒有被寫入文檔的接口應(yīng)該是內(nèi)部的静袖。
  • 為了更好的支持內(nèi)省觉鼻,模塊應(yīng)該明確的聲明那些公開的API的名字,使用模塊的__all__屬性队橙。設(shè)置__all__屬性為一個(gè)空的列表坠陈,說明這個(gè)模塊沒有任何公開的API。
  • __all__的適當(dāng)設(shè)定一樣捐康,內(nèi)部接口(包仇矾、模塊、類吹由、函數(shù)若未、屬性或者其他名字)應(yīng)該仍然使用前單下劃線作為前綴。
  • 一個(gè)接口被同樣認(rèn)為是內(nèi)部的倾鲫,當(dāng)任何包含的命名空間(包粗合、模塊或者類)被認(rèn)為是內(nèi)部的。

5. 編程建議

5.1 基本建議

  • 代碼應(yīng)該以不會(huì)不利于其他實(shí)現(xiàn)的Python(PyPy乌昔、Jython隙疚、IronPython、Cython,磕道、Psyco等)的方式供屉。

    例如,不要依賴CPython對(duì)字符串有效率的連接方法溺蕉,如a+=b或者a=a+b的表述伶丐。這個(gè)優(yōu)化在CPython(只對(duì)幾種類型生效)中是脆弱的,同時(shí)疯特,這個(gè)方式不會(huì)被實(shí)現(xiàn)哗魂,當(dāng)解釋器不使用refcounting。對(duì)于庫(kù)中性能敏感的部分漓雅,應(yīng)該是''.join()形式录别。這保證在不同的Python實(shí)現(xiàn)中,連接字符串操作是線性時(shí)間的邻吞。

5.2 比較操作

  • 與單個(gè)變量的比較组题,比如None,應(yīng)該總是用is或者is not來操作抱冷,永遠(yuǎn)不應(yīng)該是等號(hào)操作符崔列。

  • 同樣的,小心書寫if x當(dāng)你的真實(shí)意圖是if x is not None徘层。

    例如峻呕,當(dāng)測(cè)試一個(gè)變量或者參數(shù)默認(rèn)是None利职,是否被設(shè)置成為其他值是趣效,這個(gè)值瘦癌,可能是一個(gè)類型(例如容器),可以在布爾層面是False跷敬。a=[],bool(a)False讯私。

  • 使用is not操作符而不是not…is。雖然兩個(gè)表述都是正確的西傀,但是前者更易讀也更推薦

    Yes:

      if foo is not None:
    

    No:

      if not foo is None:
    
  • 當(dāng)用rich comparisons實(shí)現(xiàn)排序操作斤寇,最好實(shí)現(xiàn)全部留個(gè)比較操作符(eq , ne ,lt , le , gt , ge)而不是依賴其他代碼只演習(xí)了一個(gè)特定的比較
    為了最小化我們的工作量,functools.total_ordering()裝飾器提供了一個(gè)生成缺失比較方法的工具拥褂。
    PEP207指出自反性規(guī)則是被Python假設(shè)存在的娘锁。因此解釋器可能會(huì)用x<y交換y>x,用y>=x交換x<=y饺鹃,也可能交換x==y和x!=y的參數(shù)莫秆。sort()和min()操作保證使用<操作符,max()函數(shù)使用>操作符悔详。盡管如此镊屎,最好還是實(shí)施全部留個(gè)操作符,那么混淆將不會(huì)在其他地方產(chǎn)生茄螃。

  • 總是使用def聲明缝驳,而不是一個(gè)賦值聲明,將一個(gè)變量直接綁定到一個(gè)lambda表達(dá)式归苍。

    Yes:

      def f(x): return 2*x
    

    No:

      f = lambda x: 2*x
    

    第一種形式意味著結(jié)果函數(shù)對(duì)象的名字是f而不是一般的’<lambda>’用狱,這在棧追蹤中會(huì)更有用,同時(shí)顯示它的名字拼弃。賦值聲明的使用消除唯一一個(gè)lambda表達(dá)式的好處夏伊,就是可以一個(gè)提供越過def聲明(它可以被嵌入在一個(gè)大的表達(dá)式中)。

5.3 異常處理

  • 從Exception派生異常肴敛,而不是BaseException署海。直接從BaseException繼承,是留給那些總是被捕捉為一個(gè)錯(cuò)誤的東西的異常医男。

    設(shè)計(jì)基于代碼捕捉異常的特性的異常分層是需要的砸狞,而不是找到異常拋出的地方。旨在以編程方式回答“什么錯(cuò)了”的問題镀梭,而不是只是聲明”出現(xiàn)了一個(gè)錯(cuò)誤”刀森。類命名規(guī)則被使用在這里,盡管你需要為你的異常類添加Error后綴报账,如果這個(gè)異常是一個(gè)錯(cuò)誤研底。沒有錯(cuò)誤的異常是被用在非本地的流控制或者其他形式的不需要特殊后綴的信號(hào)埠偿。

  • 適當(dāng)?shù)氖褂卯惓f湣T赑ython3中榜晦,raise X from Y應(yīng)該被用于明確的指出替換冠蒋,而不丟失原始的棧追蹤信息。

    當(dāng)故意的替換一個(gè)內(nèi)部異常(在Python2中使用raise X乾胶,或者在Python3.3+中使用raise X from None),需要保證相關(guān)的細(xì)節(jié)被轉(zhuǎn)移到了新的異常中抖剿。(如,保留屬性名识窿,當(dāng)轉(zhuǎn)化KeyError為AttributeError斩郎,或者在新異常中嵌入原始異常的說明)

  • 當(dāng)在Python2中觸發(fā)一個(gè)異常時(shí),使用raise ValueError('message')來替代老式的用法raise ValueError,'message'喻频。
    后者在Python3中不合法缩宜。

  • 在捕獲異常時(shí),盡可能的提出特定的異常甥温,而不是裸的except: clause.因?yàn)楹苡锌赡軙?huì)捕捉到別的異常锻煌,如鍵盤中斷異常。

  • 當(dāng)綁定一個(gè)捕捉到的異常到一個(gè)名字窿侈,盡量使用在Python2.6中增加的明確的命名綁定語(yǔ)法

      try:
          process_data()
          except Exception as exc:
          raise DataProcessingFailedError(str(exc))
    

    這是唯一在Python3中支持的語(yǔ)法炼幔,同時(shí)消除了老式逗號(hào)語(yǔ)法的混淆。

  • 當(dāng)捕獲操作系統(tǒng)錯(cuò)誤時(shí)史简,最好是使用Python3.3中引入的明確的異常層次乃秀,而不是errno的值。

  • 額外的說明圆兵,對(duì)于全部的try/except語(yǔ)句跺讯,限制try中的語(yǔ)句的數(shù)量到一個(gè)盡量少的量,這可以避免掩蓋bugs

    Yes:

      try:
          value = collection[key]
      except KeyError:
          return key_not_found(key)
      else:
          return handle_value(value)
    

    No:

      try:
          # Too broad!
          return handle_value(collection[key])
      except KeyError:
          # Will also catch KeyError raised by handle_value()
          return key_not_found(key)
    

5.4 with語(yǔ)句

  • 當(dāng)一個(gè)資源對(duì)于一個(gè)特定部分的代碼是一個(gè)內(nèi)部變量時(shí)殉农,使用with聲明去保證刀脏,它會(huì)被使用后迅速、可靠的清理超凳。一個(gè)try/finally聲明也是可以接受的愈污。

  • 上下文管理器應(yīng)該被通過不同的函數(shù)或者方法調(diào)用,無(wú)論它們做除了獲取和釋放資源的任務(wù)轮傍,例如:

    Yes:

      with conn.begin_transaction():
          do_stuff_in_transaction(conn)
    

    No:

      with conn:
          do_stuff_in_transaction(conn)
    

    后一個(gè)例子并沒有提供任何信息去指明暂雹,enterexit方法在做什么除了在傳輸后關(guān)閉連接,在這種情況下创夜,明確是很重要的杭跪。

5.5 return語(yǔ)句

  • 對(duì)return聲明一致。一個(gè)函數(shù)中全部return語(yǔ)句要么都返回一個(gè)表達(dá)式,要么任何一個(gè)都不涧尿。如果任何一個(gè)返回語(yǔ)句返回一個(gè)表達(dá)式系奉,任何那些沒有返回值的返回語(yǔ)句,應(yīng)該顯示的返回None姑廉,一個(gè)顯示的返回聲明缺亮,應(yīng)該在函數(shù)的結(jié)尾保留(如果可以到達(dá))。

    Yes:

      def foo(x):
          if x >= 0:
              return math.sqrt(x)
          else:
          return None
    
      def bar(x):
          if x < 0:
              return None
          return math.sqrt(x)
    

    No:

      def foo(x):
          if x >= 0:
              return math.sqrt(x)
    
      def bar(x):
          if x < 0:
              return
          return math.sqrt(x)
    

5.6 字符串操作

  • 使用字符串方法而不是string模塊
    字符串方法一般要快的多庄蹋,同時(shí)和unicode字符串使用相同的API瞬内。如果需要想前兼容比Python2.0更老的版本迷雪,需要重寫這些規(guī)則限书。

  • 使用.startswith().endswith()而不是字符串切分,來檢查前綴或者后綴章咧。
    .startswith().endswith() 更干凈的倦西,而且更不容易出錯(cuò)的。

    For example:

    Yes: if foo.startswith('bar'):

    No: if foo[:3] == 'bar':

5.7 類型比較

  • 對(duì)象類型比較應(yīng)該總是使用isinstance() 而不是直接比較它們們的類型赁严。

    Yes: if isinstance(obj, int):

    No: if type(obj) is type(1):

  • 當(dāng)檢查一個(gè)對(duì)象是不是一個(gè)字符串扰柠。請(qǐng)留意,他可能是也是一個(gè)unicode字符串疼约,在Python2中卤档,str和unicode有相同的基類,basestring程剥,所以你可以這樣做:

    if isinstance(obj, basestring):

注意在Python3中unicode和basestring都不存在了(只有str類型)劝枣,同時(shí)一個(gè)字節(jié)對(duì)象也不再是一種類型的字符串了(它是一個(gè)整型序列了)。

  • 對(duì)于序列织鲸,(字符串舔腾,列表,元組)搂擦,使用空序列就是False的事實(shí)稳诚。

    Yes:

      if not seq:
      if seq:
    

    No:
    if len(seq):
    if not len(seq):

  • 不要寫字符串字面值依賴于顯著的空格結(jié)尾,這些尾部的空格是視覺上不能區(qū)別的瀑踢,同時(shí)有些編輯器(更近點(diǎn)的, reindent.py)會(huì)修剪它們

  • 不要比較布爾值與True或者False使用==

    Yes: if greeting:

    No: if greeting == True:

    Worse: if greeting is True:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扳还,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子橱夭,更是在濱河造成了極大的恐慌氨距,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件徘钥,死亡現(xiàn)場(chǎng)離奇詭異衔蹲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門舆驶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來橱健,“玉大人,你說我怎么就攤上這事沙廉【械矗” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵撬陵,是天一觀的道長(zhǎng)珊皿。 經(jīng)常有香客問我,道長(zhǎng)巨税,這世上最難降的妖魔是什么蟋定? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮草添,結(jié)果婚禮上驶兜,老公的妹妹穿的比我還像新娘。我一直安慰自己远寸,他們只是感情好抄淑,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驰后,像睡著了一般肆资。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灶芝,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天郑原,我揣著相機(jī)與錄音,去河邊找鬼监署。 笑死颤专,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钠乏。 我是一名探鬼主播栖秕,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼晓避!你這毒婦竟也來了簇捍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤俏拱,失蹤者是張志新(化名)和其女友劉穎暑塑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锅必,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡事格,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年惕艳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驹愚。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡远搪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逢捺,到底是詐尸還是另有隱情谁鳍,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布劫瞳,位于F島的核電站倘潜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏志于。R本人自食惡果不足惜涮因,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恨憎。 院中可真熱鬧蕊退,春花似錦、人聲如沸憔恳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)钥组。三九已至,卻和暖如春今瀑,著一層夾襖步出監(jiān)牢的瞬間程梦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工橘荠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屿附,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓哥童,卻偏偏與公主長(zhǎng)得像挺份,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贮懈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • --< > 令人討厭的小人物身上有著愚蠢的一致性 --(A Foolish Consistency is the ...
    LittleWizard閱讀 3,235評(píng)論 0 4
  • PEP介紹 PEP是 Python Enhancement Proposal 的縮寫匀泊,是Python增強(qiáng)建議書的意...
    JasonDing閱讀 4,826評(píng)論 3 40
  • 決定開始Python之路了,利用業(yè)余時(shí)間朵你,爭(zhēng)取更深入學(xué)習(xí)Python各聘。編程語(yǔ)言不是藝術(shù),而是工作或者說是工具抡医,所以...
    鴻佛閱讀 651評(píng)論 0 3
  • 代碼編排 縮進(jìn)躲因。4個(gè)空格的縮進(jìn)(編輯器都可以完成此功能),不使用Tab,更不能混合使用Tab和空格大脉。 每行最大長(zhǎng)度...
    高陽(yáng)劉閱讀 649評(píng)論 0 0
  • 代碼編排 縮進(jìn)搁嗓。4個(gè)空格的縮進(jìn)(編輯器都可以完成此功能),不使用Tap箱靴,更不能混合使用Tap和空格腺逛。 每行最大長(zhǎng)度...
    Spareribs閱讀 27,429評(píng)論 2 26