美文网首页
Python增强建议书(PEP8:Python Enhancem

Python增强建议书(PEP8:Python Enhancem

作者: 十曰立 | 来源:发表于2017-10-18 15:07 被阅读83次

    PEP8 python官方出品

    面对编码风格选择,比较常见的包括 PEP-8Google Python Style Guide

    每个PEP文件可能是描述某种功能、信息、或进程等。大部分情况下我们可以把他当成设计文档,里面包含了技术规范功能的基本原理说明等。

    PEP8是Python官方提出的:Style Guide for Python Code,算是社区规范,如果你是自己写给自己看的,那爱怎么来就怎么来,如果你是在一个公司,一个团队,那良好的代码习惯,才是缩减别人读懂你代码的时间成本有效方法,当然对于自己,良好的编写规范,也会让你的代码显得更为美观,紧急情况下,可以快速查找。

    #单行过长
    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())
    
    #类实现demo
    class Rectangle(Blob):
    
        def __init__(self, width, height,
                     color='black', emphasis=None, highlight=0):
            if (width == 0 and height == 0 and
                    color == 'red' and emphasis == 'strong' or
                    highlight > 100):
                raise ValueError("sorry, you lose")
            if width == 0 and height == 0 and (color == 'red' or
                                               emphasis is None):
                raise ValueError("I don't think so -- values are %s, %s" %
                                 (width, height))
            Blob.__init__(self, width, height,
                          color, emphasis, highlight)
    
    # 括号里边避免空格
    # 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
    
    # Yes函数调用的左括号之前不能有空格
    spam(1)
    dct['key'] = lst[index]
    
    # No
    spam (1)
    dct ['key'] = lst [index]
    
    # Yes赋值等操作符前后不能因为对齐而添加多个空格
    x = 1
    y = 2
    long_variable = 3
    
    # No
    x             = 1
    y             = 2
    long_variable = 3
    
    # Yes优先级高的运算符或操作符的前后不建议有空格。
    i = i + 1
    submitted += 1
    x = x*2 - 1
    hypot2 = x*x + y*y
    c = (a+b) * (a-b)
    
    # No
    i=i+1
    submitted +=1
    x = x * 2 - 1
    hypot2 = x * x + y * y
    c = (a + b) * (a - b)
    
    # 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)
    

    下面讲述首尾有下划线的情况:

    • _single_leading_underscore:(单前置下划线): 弱内部使用标志。 例如"from M import " 不会导入以下划线开头的对象。

    • single_trailing_underscore_(单后置下划线): 用于避免与 Python关键词的冲突。
      eq. Tkinter.Toplevel(master, class_='ClassName')

    • __double_leading_underscore(双前置下划线): 当用于命名类属性,会触发名字重整。 (在类FooBar中,__boo变成 _FooBar__boo)。

    • __double_leading_and_trailing_underscore__(双前后下划线):用户名字空间的魔法对象或属性。例如:init , import or file,不要自己发明这样的名字。

    同函数命名规则:
    非公开方法和实例变量增加一个前置下划线。
    为避免与子类命名冲突,采用两个前置下划线来触发重整。类Foo属性名为__a, 不能以 Foo.__a访问。(执著的用户还是可以通过Foo._Foo__a。) 通常双前置下划线仅被用来避免与基类的属性发生命名冲突。

    谨记这些Python指南:

    • 公开属性应该没有前导下划线。

    • 如果公开属性名和保留关键字冲突,可以添加后置下划线

    • 简单的公开数据属性,最好只公开属性名,没有复杂的访问/修改方法,python的Property提供了很好的封装方法。 d.如果不希望子类使用的属性,考虑用两个前置下划线(没有后置下划线)命名。

    公共和内部接口:

    • 任何向后兼容的保证只适用于公共接口。

    • 文档化的接口通常是公共的,除非明说明是临时的或为内部接口、其他所有接口默认是内部的。

    • 为了更好地支持内省,模块要在all属性列出公共API。

    • 内部接口要有前置下划线。

    • 如果命名空间(包、模块或类)是内部的,里面的接口也是内部的。

    • 导入名称应视为实现细节。其他模块不能间接访名字,除非在模块的API文档中明确记载,如os.path中或包的init暴露了子模块。

    此外所有try/except子句的代码要尽可的少,以免屏蔽其他的错误。

    # Yes
    try:
        value = collection[key]
    except KeyError:
        return key_not_found(key)
    else:
        return handle_value(value)
    
    # No
    try:
        # 太泛了!
        return handle_value(collection[key])
    except KeyError:
        # 会捕捉到handle_value()中的KeyError
        return key_not_found(key)
    

    python风格指南(Google出品)

    python风格指南(Google出品)

    函数注释部分

    背景:Python 是 Google主要的脚本语言。这本风格指南主要包含的是针对python的编程准则。

    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
    

    类应该在其定义下有一个用于描述该类的文档字符串. 如果你的类有公共属性(Attributes), 那么文档中应该有一个属性(Attributes)段. 并且应该遵守和函数参数相同的格式.

    class SampleClass(object):
        """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."""
    

    在逗号后面空一格,前面不空,赋值符号两边都空。

    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)
    

    相关文章

      网友评论

          本文标题:Python增强建议书(PEP8:Python Enhancem

          本文链接:https://www.haomeiwen.com/subject/usasuxtx.html