Google Python StyleGuide和Python類型註釋

上一篇我們講述了一些我個人看來比較重要的基於Airbnb Javascript規範的注意事項,這一篇我們迴歸到Python,來看一下基於Google的StyleGuide。

首先是全局變量,不論是寫web還是做一些其他的小項目,我都很少使用全局變量這個東西,很多人和我一樣,而谷歌的設計規範也說明了,在一定情況下,我們確實應該儘量避免使用全局變量。很多時候類變量已經完全滿足我們的要求了。

關於列表推導,有時確實會讓你感覺精簡,但有時複雜的列表推導也會讓你一頭霧水,正如我們想的那樣,簡單的推薦使用,複雜的還是老老實實用循環吧:,。

Yes:
  result = []
  for x in range(10):
      for y in range(5):
          if x * y > 10:
              result.append((x, y))

No:
  result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]

lambda函數的使用,總體上是比較模糊的,但是現在越來越多的人並不願意使用這個,包括我自己,谷歌表示你可以在單行代碼中使用,隨便你吧。

對於條件表達式,與列表推導相似,適用於單行函數. 在其他情況下,推薦使用完整的if語句.

因爲不支持重載,谷歌對於默認參數還是鼓勵使用的,只不過要注意不要在函數或方法定義中使用可變對象作爲默認值,這一點在JS中也有類似的共識:

Yes: def foo(a, b=None):
         if b is None:
             b = []

No:  def foo(a, b=[]):
         ...
No:  def foo(a, b=time.time()):
         ...

對於不要顯性的出現"True"和"False",同樣與JS類似,上文已經提及,在JS中"[]"是True,而在Python,[]毫無疑問是False。

對於一些過時的語言特性,諸如filter(), map()以及reduce(),我們還是不要再去使用了。

對於裝飾器,這是Python相對於其他語言最好用也是最成熟的一部分了,當然是鼓勵大家多多使用。

但是像諸如元類,動態繼承等一些更進一步的高階Python特性,我們就應該謹慎選擇了。,儘量去避免使用。

對於括號,下面所示的是完全沒有必要的,屬於濫用:

No:  if (x):
         bar()
     if not(x):
         bar()
     return (foo)

對於定義之間的空行,頂級定義之間空兩行, 方法定義之間空一行,同時不要在逗號, 分號, 冒號前面加空格, 但應該在它們後面加,除了句尾之外。

同時有一點我覺得需要大家注意的,不要用空格來垂直對齊多行間的標記,這對維護起來其實是一個巨大的麻煩:

No:
     foo       = 1000  # comment
     long_name = 2     # comment that should not be aligned

     dictionary = {
         "foo"      : 1,
         "long_name": 2,
         }

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

Yes: class SampleClass(object):
         pass


     class OuterClass(object):

         class InnerClass(object):
             pass


     class ChildClass(ParentClass):
         """Explicitly inherits from another class already."""

No: class SampleClass:
        pass


    class OuterClass:

        class InnerClass:
            pass

接着是和JS相反的,每個導入佔據一行

Yes: import os
     import sys

No: import os, sys

最後關於語句的問題,每個語句應該獨佔一行,舉個例子:

No:

  if foo: bar(foo)
  else:   baz(foo)

  try:               bar(foo)
  except ValueError: baz(foo)

  try:
      bar(foo)
  except ValueError: baz(foo)

這樣的方式是不對的,對於if,在沒有else的情況下,我們纔可以允許其歸併到一行中。

簡單說一下Python的類型註釋,在現如今Js都漸漸向Ts邁進的大環境下,動態語言的類型註釋確實是一個大項目的重要問題。對於Python來說,我們雖然只能簡單的註釋一下,但是這樣的寫法在一定程度上也是有幫助的:

def add(x:int, y:int) -> int:
    return x + y

典型的上面的demo,大家可以養成這樣的習慣,也可以關注在這方面的一些最新進展,希望能有更加滿足我們需要的解決辦法出現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章