[ Note] Google Python语言写作规范

参考: Google python

个人笔记,仅供学习使用
Author:xiaozhu_sai

  1. 圆括号、中括号、花括号可以换行,并且会将行隐式的连接起来,包括字符串

if (width == 0 and height == 0 and
 	  color == 'red' and emphasis == 'strong'):
x = ('This will build a very long long '
     'long long long long long long string')
  1. 每行代码不要超过80个字符,在注释里URL如果必要可以放在一行,哪怕很长。

No:  # See details at
     # http://www.example.com/us/developer/documentation/api/content/\
     # v2.0/csv_file_name_extension_full_specification.html
  1. 宁缺毋滥的使用括号

除非是用于实现行连接, 否则不要在返回语句或条件语句中使用括号. 不过在元组两边使用括号是可以的.

Yes: if foo:
         bar()
     while x:
         x = bar()
     if x and y:
         bar()
     if not x:
         bar()
     return foo
     for (x, y) in dict.items(): ...
No:  if (x):
         bar()
     if not(x):
         bar()
     return (foo)
  1. 缩进对齐

括号() {}如果换行

  • 第一行可以不写,其中每行必须缩进4-space
  • 第一行书写了,每行和第一行的括号对齐
    冒号:如果换行,下一行需要挂起缩进
Yes:   # Aligned with opening delimiter
       foo = long_function_name(var_one, var_two,
                                var_three, var_four)

       # Aligned with opening delimiter in a dictionary
       foo = {
    
    
           long_dictionary_key: value1 +
                                value2,
           ...
       }

       # 4-space hanging indent; nothing on first line
       foo = long_function_name(
           var_one, var_two, var_three,
           var_four)

       # 4-space hanging indent in a dictionary
       foo = {
    
    
           long_dictionary_key:
               long_dictionary_value,
           ...
       }
No:    # Stuff on first line forbidden
      foo = long_function_name(var_one, var_two,
          var_three, var_four)

      # 2-space hanging indent forbidden
      foo = long_function_name(
        var_one, var_two, var_three,
        var_four)

      # No hanging indent in a dictionary
      foo = {
    
    
          long_dictionary_key:
              long_dictionary_value,
              ...

Yes4和No3我真没看出有什么区别,找不同

  1. 空格

  • 括号左右(前后)不要有空格
Yes: spam(ham[1], {
    
    eggs: 2}, [])
No:  spam( ham[ 1 ], {
    
     eggs: 2 }, [ ] )
  • 不要在逗号、分号、冒号 , ; :左边加空格,应在右边(后面)加。(除了在行尾)
Yes: if x == 4:
         print x, y
     x, y = y, x
No:  if x == 4 :
         print x , y
     x , y = y , x
  • 二元操作符 赋值(=), 比较(==, <, >, !=, <>, <=, >=, in, not in, is, is not), 布尔(and, or, not) 两边都应该加空格。
  • 算术运算符的空格视情况,但两侧应当保持一致
  • =用语指示参数时,不应该在两侧加空格
Yes: def complex(real, imag=0.0): return magic(r=real, i=imag)
No:  def complex(real, imag = 0.0): return magic(r = real, i = imag)
  1. 注释

  • 使用三重双引号""" """包, 模块, 类或函数里的第一个语句. 这些字符串可以通过对象的.__doc__属性被自动提取
  • 函数 方法的注释
    • Args:
      列出每个参数的名字, 并在名字后使用一个冒号和一个空格, 分隔对该参数的描述.如果描述太长超过了单行80字符,使用2或者4个空格的悬挂缩进(与文件其他部分保持一致). 描述应该包括所需的类型和含义. 如果一个函数接受foo(可变长度参数列表)或者**bar (任意关键字参数), 应该详细列出foo和**bar.
    • Returns: (或者 Yields: 用于生成器)
      描述返回值的类型和语义. 如果函数返回None, 这一部分可以省略.
    • Raises:
      列出与接口有关的所有异常.
def fetch_bigtable_rows(big_table, keys, other_silly_variable=None):
    """Fetches rows from a Bigtable.

    Retrieves rows pertaining to the given keys from the Table instance
    represented by big_table.  Silly things may happen if
    other_silly_variable is not None.

    Args:
        big_table: An open Bigtable Table instance.
        keys: A sequence of strings representing the key of each table row
            to fetch.
        other_silly_variable: Another optional variable, that has a much
            longer name than the other args, and which does nothing.

    Returns:
        A dict mapping keys to the corresponding table row data
        fetched. Each row is represented as a tuple of strings. For
        example:

        {'Serak': ('Rigel VII', 'Preparer'),
         'Zim': ('Irk', 'Invader'),
         'Lrrr': ('Omicron Persei 8', 'Emperor')}

        If a key from the keys argument is missing from the dictionary,
        then that row was not found in the table.

    Raises:
        IOError: An error occurred accessing the bigtable.Table object.
    """
    pass
  • 类Class
    类应该在其定义下有一个用于描述该类的文档字符串. 如果你的类有公共属性(Attributes), 那么文档中应该有一个属性(Attributes)段. 并且应该遵守和函数参数相同的格式.
    """Summary of class here.

    Longer class information....
    Longer class information....

    Attributes:
        likes_spam: A boolean indicating if we like SPAM or not.
        eggs: An integer count of the eggs we have laid.
    """

    def __init__(self, likes_spam=False):
        """Inits SampleClass with blah."""
        self.likes_spam = likes_spam
        self.eggs = 0

    def public_method(self):
        """Performs operation blah."""

另一方面, 绝不要描述代码. 假设阅读代码的人比你更懂Python, 他只是不知道你的代码要做什么.

此段大部分直接Copy,细节请见参考文章

  1. 字符串

即使参数都是字符串, 使用%操作符或者格式化方法格式化字符串. 不过也不能一概而论, 你需要在+和%之间好好判定.
保持使用字符串引号的一致性. 使用单引号’或者双引号”之一用以引用字符串, 并在同一文件中沿用

Yes: x = a + b
     x = '%s, %s!' % (imperative, expletive)
     x = '{}, {}!'.format(imperative, expletive)
     x = 'name: %s; score: %d' % (name, n)
     x = 'name: {}; score: {}'.format(name, n)
No: x = '%s%s' % (a, b)  # use + in this case
    x = '{}{}'.format(a, b)  # use + in this case
    x = imperative + ', ' + expletive + '!'
    x = 'name: ' + name + '; score: ' + str(n)
  1. 文件

推荐使用 with open(' ', '' ) as f : pass来管理文件

  1. todo

# TODO([email protected]): Use a "*" here for string repetition.
# TODO(Zeke) Change this to use relations.
  1. 导入

Yes: import os
     import sys
No:  import os, sys

参考: Google python

猜你喜欢

转载自blog.csdn.net/weixin_42375356/article/details/110479608
今日推荐