{"action":"reopened","issue":{"url":"https://api.github.com/repos/LeslieZhu/MinYi/issues/10","labels_url":"https://api.github.com/repos/LeslieZhu/MinYi/issues/10/labels{/name}","comments_url":"https://api.github.com/repos/LeslieZhu/MinYi/issues/10/comments","events_url":"https://api.github.com/repos/LeslieZhu/MinYi/issues/10/events","html_url":"https://github.com/LeslieZhu/MinYi/issues/10","id":120083240,"number":10,"title":"PEP8: Python编码风格","user":{"login":"LeslieZhu","id":2840435,"avatar_url":"https://avatars.githubusercontent.com/u/2840435?v=3","gravatar_id":"","url":"https://api.github.com/users/LeslieZhu","html_url":"https://github.com/LeslieZhu","followers_url":"https://api.github.com/users/LeslieZhu/followers","following_url":"https://api.github.com/users/LeslieZhu/following{/other_user}","gists_url":"https://api.github.com/users/LeslieZhu/gists{/gist_id}","starred_url":"https://api.github.com/users/LeslieZhu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LeslieZhu/subscriptions","organizations_url":"https://api.github.com/users/LeslieZhu/orgs","repos_url":"https://api.github.com/users/LeslieZhu/repos","events_url":"https://api.github.com/users/LeslieZhu/events{/privacy}","received_events_url":"https://api.github.com/users/LeslieZhu/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/LeslieZhu/MinYi/labels/Python%E4%B8%8E%E9%BB%91%E5%AE%A2","name":"Python与黑客","color":"eb6420"}],"state":"open","locked":false,"assignee":null,"milestone":{"url":"https://api.github.com/repos/LeslieZhu/MinYi/milestones/5","html_url":"https://github.com/LeslieZhu/MinYi/milestones/2015-week-52","labels_url":"https://api.github.com/repos/LeslieZhu/MinYi/milestones/5/labels","id":1468464,"number":5,"title":"2015-week-52","description":"这是2015年最后一周，本来想花一天时间写篇关于swift开发OSX程序，结果这方面资料很少，在日新月异的发展当中，估计花一周时间也只能学点皮毛了。另外一篇关于Python在信息安全应用的，发现之前找好的文章内容有点过于浅显，又要比预计时间多一倍不止。","creator":{"login":"LeslieZhu","id":2840435,"avatar_url":"https://avatars.githubusercontent.com/u/2840435?v=3","gravatar_id":"","url":"https://api.github.com/users/LeslieZhu","html_url":"https://github.com/LeslieZhu","followers_url":"https://api.github.com/users/LeslieZhu/followers","following_url":"https://api.github.com/users/LeslieZhu/following{/other_user}","gists_url":"https://api.github.com/users/LeslieZhu/gists{/gist_id}","starred_url":"https://api.github.com/users/LeslieZhu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LeslieZhu/subscriptions","organizations_url":"https://api.github.com/users/LeslieZhu/orgs","repos_url":"https://api.github.com/users/LeslieZhu/repos","events_url":"https://api.github.com/users/LeslieZhu/events{/privacy}","received_events_url":"https://api.github.com/users/LeslieZhu/received_events","type":"User","site_admin":false},"open_issues":6,"closed_issues":0,"state":"closed","created_at":"2015-12-20T15:36:37Z","updated_at":"2016-01-06T06:33:28Z","due_on":"2015-12-26T16:00:00Z","closed_at":"2015-12-27T16:28:50Z"},"comments":0,"created_at":"2015-12-03T02:48:19Z","updated_at":"2016-01-06T06:33:28Z","closed_at":null,"body":"<a name='toc'>**目录:**</a>\r\n\r\n* [PEP8: Python代码风格](#1)\r\n* [蛮目的追求一致性是误入魔道](#2)\r\n* [代码排版](#3)\r\n  * [缩进](#4)\r\n  * [制表符vs空格](#5)\r\n  * [行最大长度](#6)\r\n  * [空行](#7)\r\n  * [源文件编码格式](#8)\r\n  * [导入(import)](#9)\r\n* [字符串引号](#10)\r\n* [表达式和语句中的空格](#11)\r\n  * [口头禅](#12)\r\n  * [其它建议](#13)\r\n* [注释](#14)\r\n  * [注释块](#15)\r\n  * [单行注释](#16)\r\n  * [文档字符串注释](#17)\r\n* [版本控制](#18)\r\n* [命名规范](#19)\r\n  * [首要原则](#20)\r\n  * [描述：命名风格](#21)\r\n  * [规定: 命名惯例](#22)\r\n    * [避免使用的命名](#23)\r\n    * [包和模块名字](#24)\r\n    * [类名字](#25)\r\n    * [异常名字](#26)\r\n    * [全局变量名](#27)\r\n    * [函数名](#28)\r\n    * [函数和方法参数名](#29)\r\n    * [方法名与实例变量](#30)\r\n    * [常数](#31)\r\n    * [专为继承而设计](#32)\r\n  * [公共接口与内部接口命名](#33)\r\n* [编程建议](#34)\r\n\r\n\r\n- 原文链接: [PEP 0008 -- Style Guide for Python Code](https://www.python.org/dev/peps/pep-0008/)\r\n\r\n# <a name='1'>[PEP8: Python代码风格](#1)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n从Python官方文档中翻译、整理的一个笔记，是Python代码风格方面的约定。\r\n\r\n\r\n\r\n# <a name='2'>[蛮目的追求一致性是误入魔道](#2)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\nGuido认为在程序开发中，大部分时间是花在看代码上，因此可读性非常重要。\r\n\r\n制定风格指南是为了一致性，一致的编码风格是重要的，一致的项目风格是重要的，一致的模块或函数风格就更加重要。\r\n\r\n但更重要的是知道什么时候不保持一致：当风格指南变得不适用的时候。当犹豫不决时，听从你的判断力，看看其它代码然后决定怎么样做看起来更好。不要羞于提问。\r\n\r\n原则上来讲，不要为了使用PEP8风格指南而忽略向后兼容性。\r\n\r\n但有时候出于下列原因可以不遵循这个指南:\r\n\r\n- 哪怕根据PEP8来阅读代码，适用指南还是会减低代码可读性\r\n- 为了和其它没有遵循此指南的代码保持一致（可能是历史原因），但这也是清除烂代码的时候（根据敏捷开发风格）\r\n- 很久远的代码，旧到那会儿还没有PEP8，也没有其它的原因去改动代码\r\n- 但代码需要和旧版本的Python保持兼容，低版本的Python可能不支持PEP8风格中的某些特性\r\n\r\n# <a name='3'>[代码排版](#3)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n## <a name='4'>[缩进](#4)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n使用4个空格缩来表示缩进。\r\n\r\n连续的代码行应该保持一样的缩进，不管是使用Python语句中的中括号、圆括号，还是悬挂缩进。当使用悬挂缩进的时候，在第一行不要包含参数，而缩进要能够明确的区分每行内容。\r\n\r\n正确:\r\n\r\n```python\r\n# 和开始的中括号对齐\r\nfoo = long_function_name(var_one, var_two,\r\n                         var_three, var_four)\r\n\r\n# 增加缩进以和其它代码区分开来\r\ndef long_function_name(\r\n        var_one, var_two, var_three,\r\n        var_four):\r\n    print(var_one)\r\n\r\n# 悬挂缩进要增加一个缩进级别\r\nfoo = long_function_name(\r\n        var_one, var_two,\r\n        var_three, var_four)\r\n```\r\n\r\n错误:\r\n\r\n```python\r\n# 没有对齐\r\nfoo = long_function_name(var_one, var_two,\r\n    var_three, var_four)\r\n\r\n# 缩进不够\r\ndef long_function_name(\r\n    var_one, var_two, var_three,\r\n    var_four):\r\n    print(var_one)\r\n```\r\n\r\n4个空格表示一级缩进的规定是可以灵活使用的:\r\n\r\n```python\r\n# 这种缩进可能不一定需要使用4个空格\r\nfoo = long_function_name(\r\n  var_one, var_two,\r\n  var_three, var_four)\r\n ```\r\n\r\n当if语句长到需要跨行的时候，没有必要改成两个if语句，增加一个空格，增加一个开括号，然后下一行保持缩进即可:\r\n\r\n```python\r\n# 没有额外的缩进\r\nif (this_is_one_thing and\r\n    that_is_another_thing):\r\n    do_something()\r\n\r\n# 增加一条注释，在某些编辑器会语法高亮，从而起到区分作用\r\nif (this_is_one_thing and\r\n    that_is_another_thing):\r\n    # Since both conditions are true, we can frobnicate.\r\n    do_something()\r\n\r\n# 增加一些缩进\r\nif (this_is_one_thing\r\n        and that_is_another_thing):\r\n    do_something()\r\n```\r\n\r\n代码块结束符如中括号、圆括号等在多行代码的情况下，可以和上一行第一个非空白字符保持缩进:\r\n\r\n```python\r\nmy_list = [\r\n    1, 2, 3,\r\n    4, 5, 6,\r\n    ]\r\nresult = some_function_that_takes_arguments(\r\n    'a', 'b', 'c',\r\n    'd', 'e', 'f',\r\n    )\r\n```\r\n\r\n也可以直接和上一行第一个字符保持缩进:\r\n\r\n```python\r\nmy_list = [\r\n    1, 2, 3,\r\n    4, 5, 6,\r\n]\r\nresult = some_function_that_takes_arguments(\r\n    'a', 'b', 'c',\r\n    'd', 'e', 'f',\r\n)\r\n```\r\n\r\n## <a name='5'>[制表符vs空格](#5)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n推荐使用空格表示缩进。\r\n\r\n只有当之前使用了制表符，为了保持统一的缩进而不得不使用制表符的时候才使用制表符，能不用就不要用。\r\n\r\n在Python 3不允许混用空格和制表符。\r\n\r\n在Python 2中混用了空格和制表符的应该换成只使用空格来表示缩进。\r\n\r\n在Python 2与命令行中执行时，加上-t参数，会警告混用了制表符与空格的情况，如果使用-tt参数则变成错误看待。强烈推荐使用！\r\n\r\n\r\n## <a name='6'>[行最大长度](#6)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n行最大长度不要超过79个字符。\r\n\r\n对于大段的包含一定结构的字符串（文档字符串或注释），行的长度不要超过72个字符。\r\n\r\n限制长度可以让编辑器同时打开多个文件，方便一一对照来查看、比较多个版本的代码。\r\n\r\n如果要使用很长的行，则推荐使用`\\`来连接:\r\n\r\n```python\r\nwith open('/path/to/some/file/you/want/to/read') as file_1, \\\r\n     open('/path/to/some/file/being/written', 'w') as file_2:\r\n    file_2.write(file_1.read())\r\n```\r\n\r\n也可以在操作符后面断行，但要保持缩进:\r\n\r\n```python\r\nclass Rectangle(Blob):\r\n\r\n    def __init__(self, width, height,\r\n                 color='black', emphasis=None, highlight=0):\r\n        if (width == 0 and height == 0 and\r\n                color == 'red' and emphasis == 'strong' or\r\n                highlight > 100):\r\n            raise ValueError(\"sorry, you lose\")\r\n        if width == 0 and height == 0 and (color == 'red' or\r\n                                           emphasis is None):\r\n            raise ValueError(\"I don't think so -- values are %s, %s\" %\r\n                             (width, height))\r\n        Blob.__init__(self, width, height,\r\n                      color, emphasis, highlight)\r\n```\r\n\r\n## <a name='7'>[空行](#7)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n顶级函数和类定义前后应该留2个空行。\r\n\r\n在类里面的函数定义之间保留1个空行。\r\n\r\n可以多加1个空行来分隔一组相关函数。而对于一堆只有1行的内容之间，有时可以省去空行分隔。\r\n\r\n在函数里可以适当的添加空行来组织逻辑。\r\n\r\nPython支持特殊字符Crtl-L(^L)，一些工具会把这些字符看做分页符，因此可以在文件中把这些字符当作分页符使用。但有些编辑器或基于web的阅读器并不会`^L`看成特殊字符，而是直接显示这个字符。\r\n\r\n\r\n## <a name='8'>[源文件编码格式](#8)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\nPython发行版核心代码一般都是UTF-8编码(Python 2使用ASCII).\r\n\r\n源文件在Python 2中使用ASCII或在Python 3中使用UTF-8应该不会遇到编码问题。\r\n\r\n在标准库中，不是使用默认编码格式的应该只用于测试或者注释/文档的作者名字包含非ASCII字符。总之，在字符串中包含非ASCII码最好使用在前面添加`\\x`,`\\u`,`\\U`,`\\N`的方式.\r\n\r\n从Python 3.0之后，标准库要符合下列要求(参考 PEP 3131):\r\n\r\n- 所有标识符必须只包含ASCII字符，并且应该尽量使用英文单词（有时，有些缩写或技术术语并非使用英文）\r\n- 尽量保持字符串、注释使用ASCII，例外情况包括:\r\n   - 测试用例需要测试到和非ASCII有关的功能\r\n   - 作者名字包含了非拉丁字符\r\n\r\n开源项目的受众是全球的开发人员，应该也遵守这些条款。\r\n\r\n## <a name='9'>[导入(import)](#9)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n导入时应该一行一行的分开，如:\r\n\r\n正确做法:\r\n\r\n```python\r\nimport os\r\nimport sys\r\n```\r\n\r\n错误做法:\r\n\r\n```python\r\nimport sys, os\r\n```\r\n\r\n但这样做是可以的:\r\n\r\n```python\r\nfrom subprocess import Popen, PIPE\r\n```\r\n\r\n导入部分代码应该总是在源文件的前几行，紧跟在模块注释或文档之后，在模块全局变量、声明之前。\r\n\r\n导入部分应该按照下列顺序分组导入:\r\n\r\n- 导入标准库\r\n- 导入相关第三方库\r\n- 导入本地程序/库\r\n\r\n在每组之间应该用一个空行分割.\r\n\r\n在导入部分代码后面，紧跟着指定 `__all__` 。\r\n\r\n建议使用绝对路径导入，这样有更好的可读性，同时在导入操作出问题时更好定位问题根源:\r\n\r\n```python\r\nimport mypkg.sibling\r\nfrom mypkg import sibling\r\nfrom mypkg.sibling import example\r\n```\r\n\r\n当然，使用相对路径导入也是可以接受的，尤其是当软件包文件结构很复杂的时候，使用绝对路径导入显得没有必要:\r\n\r\n```python\r\nfrom . import sibling\r\nfrom .sibling import example\r\n```\r\n\r\n标准库的代码应该避免过于复杂的包文件结构，总是使用绝对路径导入。\r\n\r\n在Python 3中已经不支持相对路径导入了，因此，不要使用相对路径导入.\r\n\r\n但从一个包含类的模块中导入一个类，一般可以这样:\r\n\r\n```python\r\nfrom myclass import MyClass\r\nfrom foo.bar.yourclass import YourClass\r\n```\r\n\r\n如果这样会导致本地变量名混淆，则可以这样:\r\n\r\n```python\r\nimport myclass\r\nimport foo.bar.yourclass\r\n```\r\n\r\n然后使用 `myclass.MyClass` 和 `foo.bar.yourclass.YourClass` 来调用。\r\n\r\n尽量避免一股脑的全导入(`from <module> import *`)，这样无法知晓到底哪些导入到了名字空间，减低了可读性，也导致一些自动化工具无法工作。有一种情况下可以使用全部导入，就是要把内部结构当作外部公共API的时候。\r\n\r\n即使是一股脑全部导入的方式，此文档后续部分依旧适用于公共、内部接口。\r\n\r\n\r\n# <a name='10'>[字符串引号](#10)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n在Python语言中，单引号和双引号是一样的，但一个字符串中已经有单引号或双引号时，可以使用另一个来避免转义字符，这样可以增加可读性。\r\n\r\n对于一大段字符串，建议使用双引号来作为**文档字符串**，参阅 PEP 257.\r\n\r\n\r\n# <a name='11'>[表达式和语句中的空格](#11)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n## <a name='12'>[口头禅](#12)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n在下列情况下避免无关的空格:\r\n\r\n- 紧挨着中括号、圆括号、大括号时\r\n\r\n```\r\nYes: spam(ham[1], {eggs: 2})\r\nNo:  spam( ham[ 1 ], { eggs: 2 } )\r\n```\r\n\r\n- 紧挨着逗号、冒号、分号时\r\n\r\n```\r\nYes: if x == 4: print x, y; x, y = y, x\r\nNo:  if x == 4 : print x , y ; x , y = y , x\r\n```\r\n\r\n- 在切片(slice)中，冒号起到操作符的作用，在符号两边的数量应该相等，即两边要有一样的空格数据量。\r\n\r\nYes:\r\n\r\n```python\r\nham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:]\r\nham[lower:upper], ham[lower:upper:], ham[lower::step]\r\nham[lower+offset : upper+offset]\r\nham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)]\r\nham[lower + offset : upper + offset]\r\n```\r\n\r\nNo:\r\n\r\n```python\r\nham[lower + offset:upper + offset]\r\nham[1: 9], ham[1 :9], ham[1:9 :3]\r\nham[lower : : upper]\r\nham[ : upper]\r\n```\r\n\r\n- 函数调用时括号前面不需要空格\r\n\r\n```\r\nYes: spam(1)\r\nNo:  spam (1)\r\n```\r\n\r\n- 索引或切片中括号前不需要空格\r\n\r\n```\r\nYes: dct['key'] = lst[index]\r\nNo:  dct ['key'] = lst [index]\r\n```\r\n\r\n- 不必为了对齐，而在等号左右添加空格\r\n\r\nYes:\r\n\r\n```\r\nx = 1\r\ny = 2\r\nlong_variable = 3\r\n```\r\n\r\nNo:\r\n\r\n```\r\nx             = 1\r\ny             = 2\r\nlong_variable = 3\r\n```\r\n\r\n## <a name='13'>[其它建议](#13)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n\r\n- 在这些操作符前后添加1个空格:=,+=,-=,==,<,>,!=,<>,<=,>=,in,not in,is,is not,and,or,not\r\n- 如果操作符有不同的优先级，则在低优先级的符号前后加空格，视情况而定，但绝不要多余1个空格，并且要加空格就要保证前后空格一样多\r\n\r\nYes:\r\n\r\n```\r\ni = i + 1\r\nsubmitted += 1\r\nx = x*2 - 1\r\nhypot2 = x*x + y*y\r\nc = (a+b) * (a-b)\r\n```\r\n\r\nNo:\r\n\r\n```\r\ni=i+1\r\nsubmitted +=1\r\nx = x * 2 - 1\r\nhypot2 = x * x + y * y\r\nc = (a + b) * (a - b)\r\n```\r\n\r\n- 当等号用于传递参数或定义默认参数时，前后不要空格\r\n\r\nYes:\r\n\r\n```\r\ndef complex(real, imag=0.0):\r\n    return magic(r=real, i=imag)\r\n```\r\n\r\nNo:\r\n\r\n```\r\ndef complex(real, imag = 0.0):\r\n    return magic(r = real, i = imag)\r\n```\r\n\r\n\r\n- 不要将多条语句混合在一起\r\n\r\nYes:\r\n\r\n```\r\nif foo == 'blah':\r\n    do_blah_thing()\r\ndo_one()\r\ndo_two()\r\ndo_three()\r\n```\r\n\r\n尽量不要:\r\n\r\n```\r\nif foo == 'blah': do_blah_thing()\r\ndo_one(); do_two(); do_three()\r\n```\r\n\r\n- 有时候，将if/for/while的语句块放在同一行是可以的；但不可以是多行，更好避免过长的代码行\r\n\r\n尽量不要:\r\n\r\n```\r\nif foo == 'blah': do_blah_thing()\r\nfor x in lst: total += x\r\nwhile t < 10: t = delay()\r\n```\r\n\r\n绝对不要:\r\n\r\n```\r\nif foo == 'blah': do_blah_thing()\r\nelse: do_non_blah_thing()\r\n\r\ntry: something()\r\nfinally: cleanup()\r\n\r\ndo_one(); do_two(); do_three(long, argument,\r\n                             list, like, this)\r\n\r\nif foo == 'blah': one(); two(); three()\r\n```\r\n\r\n# <a name='14'>[注释](#14)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n如果注释会误导对代码的理解，还不如没有注释； 当代码逻辑改变时，一定要及时更新注释。\r\n\r\n注释应该是完整的句子。如果注释是一个词组或句子，则首字母应该大写，除非它本身是一个小写字母开头的标识符。\r\n\r\n如果注释很短，后面的句号可以省略。注释块由多个句子组成段落，则每句后面都要有句号。\r\n\r\n每句句号后面要有空格。\r\n\r\n当使用英文写注释时，请阅读**William Strunk Jr.和E. B. White书籍《The Elements of Style》**\r\n\r\n非英文国家的Python开发者: 请使用英文写注释，除非你百分之百确定都代码的人都懂自己本国语言。\r\n\r\n## <a name='15'>[注释块](#15)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n注释块后面一般跟着代码，注释和代码的缩进是一致的。每个注释行以`# `开头；注释块里面分段是用单独的`#`作为一行分割\r\n\r\n## <a name='16'>[单行注释](#16)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n尽量少用单行注释。\r\n\r\n单号注释一般和要注释的代码语句保持在一行，和代码之间至少要有2个空格的空间。\r\n\r\n单行注释一般是没必要的，如果语句已经很明确了，就更没有必要单行注释了。\r\n\r\n不要这样写:\r\n\r\n```\r\nx = x + 1                 # Increment x\r\n```\r\n\r\n但有时这样是有用的:\r\n\r\n```\r\nx = x + 1                 # Compensate for border\r\n```\r\n\r\n## <a name='17'>[文档字符串注释](#17)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n详细说明如何写好文档字符串，参考PEP 257:\r\n\r\n- 为所有公共模块、函数、类、方法加上文档字符串\r\n- PEP257讲述了如何写好文档字符串，一般结束文档字符串的`\"\"\"`应该单独一行:\r\n\r\n```\r\n\"\"\"Return a foobang\r\n\r\nOptional plotz says to frobnicate the bizbaz first.\r\n\"\"\"\r\n```\r\n\r\n- 对于只有一行的文档字符串，则可以将`\"\"\"`结束符也在同一行\r\n\r\n\r\n# <a name='18'>[版本控制](#18)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n如果你是要SVN、CVS、RCS，则:\r\n\r\n```python\r\n__version__ = \"$Revision$\"\r\n# $Source$\r\n```\r\n\r\n这些行应该紧跟着模块文档字符串后面，前面不要有其它任何内容，前后添加空行来分隔。\r\n\r\n\r\n# <a name='19'>[命名规范](#19)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n\r\nPython的命令规范有点乱，这些是目前的惯例，新的模块或软件包应该遵循这些命名规范，但已经存在的旧软件包则保持内部的一致性即可。\r\n\r\n## <a name='20'>[首要原则](#20)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n面向用户的公共API命名应该反映如何使用，而不是如何实现。\r\n\r\n## <a name='21'>[描述：命名风格](#21)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n有很多种命名风格，根据使用目的来决定如何命名，下列命名风格是优雅的：\r\n\r\n- b (单个小写字母)\r\n- B (单个大写字母)\r\n- lowercase\r\n- lower_case_with_underscores\r\n- UPPERCASE\r\n- UPPER_CASE_WITH_UNDERSCORES\r\n- CapitalizedWords(每个单词首字母大写，对于缩写全部使用大写字母)\r\n- mixedCase (首字母小写，其它单词大写字母开头)\r\n- Capitalized_Words_With_Underscores (丑死了！)\r\n\r\n有一种风格是使用某个前缀来表示一组相关的名字，但在Python中使用的不多，除非是为了某种整体性。\r\n\r\n软件包X11的所有公共函数都用X开头，但在Python里面这个没有必要，因为变量和方法名前面都已经有了调用的对象，函数名前面也会包含模块名。\r\n\r\n有些时候，下面这种特殊命名是可以接受的:\r\n\r\n- `_single_leading_underscore` : 作为私有，当使用不会导入这种以下划线开头的变量或函数\r\n    ```\r\n    from M import *\r\n    ```\r\n- `single_trailing_underscore_` : 为了防止和Python关键字冲突，如\r\n    ```\r\n    Tkinter.Toplevel(master, class_='ClassName')\r\n    ```\r\n\r\n\r\n- `__double_leading_underscore` : 定义类变量时，重新生成调用名，如在类FooBar中, `__boo`变成`_FooBar__boo`\r\n- `__double_leading_and_trailing_underscore__` : 可以存在用户控制命名空间的魔法对象，如`__init__ `, `__import__` 或 `__file__`。永远不要使用这样的命名，知道它们存在就够了！\r\n\r\n## <a name='22'>[规定: 命名惯例](#22)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n\r\n### <a name='23'>[避免使用的命名](#23)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n永远不要使用`l`,`O`,`I`单个字符作为变量名，在某些字体里面很容易和其它字母混淆。\r\n\r\n### <a name='24'>[包和模块名字](#24)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n模块名应该全由小写字母组成的简短字符串，如果能够提高可读性，也可以使用大写字母。\r\n\r\n软件包名应该全由小写字母组成的简短字符串，严禁使用下划线命名。\r\n\r\n但使用C/C++开发的扩展模块时，可能提供的接口会有下划线，如`_socket`\r\n\r\n\r\n### <a name='25'>[类名字](#25)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n类名字每个单词的开头字母应该大写。\r\n\r\n\r\n### <a name='26'>[异常名字](#26)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n因为异常一般是类，要遵循类命名规则，但后缀必须有`Error`.\r\n\r\n\r\n### <a name='27'>[全局变量名](#27)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n假设这些变量只在模块内部使用，这个规范也适用于函数内部。\r\n\r\n如果模块内部的变量要这样使用:\r\n\r\n```python\r\nfrom M import *\r\n```\r\n\r\n那么应该使用`__all__`来提供导出的变量名，或者通过以下划线开头作为私有变量来防止被导入其它名字空间。\r\n\r\n\r\n### <a name='28'>[函数名](#28)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n函数名应该是小写字母组成，如果有多个单词则用下划线连接起来，这样可以提高可读性。\r\n\r\n混合大小写尽量避免，除非是为了以前的代码需要保持兼容性。\r\n\r\n### <a name='29'>[函数和方法参数名](#29)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n对于实例方法的第一个参数总是`self`.\r\n\r\n对于类方法的第一个参数总是`cls`.\r\n\r\n如果函数参数和关键字冲突了，可以在后面添加一个下划线，而不建议另外取一个奇怪的名字，不如`class_`就比`clss`好。\r\n\r\n### <a name='30'>[方法名与实例变量](#30)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n使用函数命名规则:全部小写，如果需要就用下划线分割单词。\r\n\r\n\r\n只有私有方法或变量才会以一个下划线开头。\r\n\r\n为了避免和子类命名冲突，可以用两个下划线开头命名；根据Python特性，如果类Foo有一个变量`__a`，则无法通过`Foo.__a`来访问，需要通过`Foo._Foo__a`的形式来访问。但不要滥用，只有为了和子类避免冲突才会这样命名。\r\n\r\n\r\n### <a name='31'>[常数](#31)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n常数一般是模块级别的，所有字母都大写，用下划线连接，如MAX_OVERFLOW,TOTAL\r\n\r\n\r\n### <a name='32'>[专为继承而设计](#32)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n要常考虑一个类的方法和实例应该设置为公有还是非公有，如果不好决定，那么先设置为非公有，因为非公有变为公有相对好办，反过来则有更大的风险。\r\n\r\n公有变量是给别人使用的，应该避免变动，以免造成使用这些公有变量的程序出问题。非公有变量是不会被第三方使用到，不管是改变还是删除都应该没有问题，只要保证不对其它第三方造成错误。\r\n\r\n我们不使用『私有』这个说法，因为在Python里面没有真正意义上的『私有』。\r\n\r\n还有一类属于『子类API』的变量，在其它语言一般叫做『保护』变量；有些类是设计来被继承的，不管是通过导入还是重载的方式。当设计这样一个类时，要认真考虑这些问题:\r\n\r\n- 对于哪个变量要设为『公有』\r\n- 哪个会作为子类API\r\n- 哪个是确实只会在类内部使用，\r\n\r\n这些是一些Pythonic的做法:\r\n\r\n- 公有变量不应该以下划线开头\r\n- 如果公有变量和关键字冲突，在公有变量后面增加一个下划线。最好使用正确的拼写，但也不是那么绝对，比如`cls`就一般代表`class`。\r\n- 对于简单的数据变量，最好直接使用变量名，不必增加设置、访问方法。Python很容易提高性能，数据变量访问可以获得相对高的性能，使用属性访问的方式代替函数调用是可以提高性能的一种访问语法。\r\n- 如果类被子类继承，但有些变量不想让子类使用到，则可以命名的时候以双下划线开头，这样可以避免在子类里面造成变量名污染。\r\n\r\n## <a name='33'>[公共接口与内部接口命名](#33)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n用户应该很容易辨别公共接口和内部接口。\r\n\r\n一般带文档化接口是公共的，除非这些文档是为内部接口定义的；所有没有文档的接口都默认是内部接口。\r\n\r\n为了更好的排查错误，模块的所有公共API应该使用`__all__`变量来声明，当`__all__`是一个空列表时，则相当于模块没有公共API。\r\n\r\n即使有了`__all__`这个措施，内部接口(包括包、模块、类、函数、变量或其它)还是需要以下划线开头。\r\n\r\n当一个接口被内部名字空间包含时，这个接口也是内部的。\r\n\r\n导入的名字应该始终作为一个实现细节来看待，其它模块不应该依赖于直接访问这些导入的名字，除非它们明确的在模块API里面用文档说明了，比如`os.path`或包的`__ini__`属于公开功能的子模块。\r\n\r\n\r\n# <a name='34'>[编程建议](#34)</a>\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:dart:[回到目录](#toc)\r\n\r\n- 代码不应该排斥Python的其它实现版本，如PyPy, Jython, IronPython, Cython, Psyco等。比如，不要依赖于CPython连接字符串的高效实现，像`a += b`或`a = a + b`形式。这种用法在CPython中也不是通用的，并非在所有实现版本都能很好的支持。为了性能提升，使用`''.join()`应该会更好些，这样可以保证在所有版本中线性执行。\r\n- 对于`None`的比较，应该只用`is`和`is not`，不要使用等号；同样，如果你要表达`if x is None`，请直接使用`if x`即可。\r\n- 使用`is not`操作符，而不是`not...is`:\r\n    Yes:\r\n\r\n    ```python\r\n    if foo is not None:\r\n    ```\r\n\r\n    No:\r\n\r\n    ```python\r\n    if not foo is None:\r\n    ```\r\n- 当要实现比较操作时，最好同时实现6个操作: `__eq__` , `__ne__` , `__lt__` , `__le__` , `__gt__` , `__ge__`;另外，`functools.total_ordering()`可以自动生成剩下的比较操作方法。\r\n- 使用`def`明确定义函数，而不要通过赋值语句使用`lambda`形式的匿名函数:\r\n    Yes:\r\n\r\n    ```python\r\n    def f(x): return 2*x\r\n    ```\r\n\r\n    No:\r\n\r\n    ```python\r\n    f = lambda x: 2*x\r\n    ```\r\n- 从`Exception`衍生出异常类，而不是从`BaseException`直接衍生，直接继承`BaseException`往往导致捕获异常时出错。设计异常继承时，知道异常具体信息比知道异常发生的位置更重要。\r\n- 尽量使用异常链，在Python 3中，使用`raise X from Y`来代替直接丢弃异常回溯路径。\r\n- 在Python 2中触发异常，使用`raise ValueError('message')`,而不是使用`raise ValueError, 'message'`；后一种语法在Python 3中已经不支持了。\r\n- 当捕获异常时，尽量指明是哪种异常，而不是使用`except: 其它子句`:\r\n    ```python\r\n    try:\r\n        import platform_specific_module\r\n    except ImportError:\r\n        platform_specific_module = None\r\n    ```\r\n\r\n    使用`except: 其它子句`的形式会捕获`SystemExit`,`KeyboardInterrupt`，从而导致很难获取`Ctrl-C`并导致其它问题。如果想捕获所有的异常，可以使用`except Exception:`，而之前的错误用法等同于`except BaseException:`\r\n\r\n    可以这样更好的使用`except`:\r\n\r\n    - 如果有异常处理程序，则应该会打印或记录日志，或者至少要报告发现了错误\r\n    - 如果程序要做一些清理工作，可以通过`raise`触发一个异常，然后在`try...finally`进行处理，这种方式比较好\r\n- 如果要将异常绑定一个名字，推荐使用Python 2.6增加的语法:\r\n    ```python\r\n    try:\r\n        process_data()\r\n    except Exception as exc:\r\n        raise DataProcessingFailedError(str(exc))\r\n    ```\r\n    在Python 3中只支持这种语法，从而避免以前使用逗号分隔语法造成的问题。\r\n- 当捕获系统错误，最好使用Python 3.3中的详细异常说明，而不是仅仅一个`errno`值\r\n- 一般情况下，对于`try/except`语句，尽量减少`try`里面的代码量，这样可以避免引入Bug:\r\n    Yes:\r\n\r\n    ```python\r\n    try:\r\n        value = collection[key]\r\n    except KeyError:\r\n        return key_not_found(key)\r\n    else:\r\n        return handle_value(value)\r\n    ```\r\n\r\n    No:\r\n\r\n    ```python\r\n    try:\r\n        # Too broad!\r\n        return handle_value(collection[key])\r\n    except KeyError:\r\n        # Will also catch KeyError raised by handle_value()\r\n        return key_not_found(key)\r\n    ```\r\n- 当本地使用到某些资源时，使用`with`来保证进行了资源的释放等工作，也可以使用`try/finall`语句来处理。\r\n- 不论是获取资源，还是释放资源，上下文管理器都应该操作一个独立的函数或方法:\r\n\r\n    Yes:\r\n\r\n    ```python\r\n    with conn.begin_transaction():\r\n        do_stuff_in_transaction(conn)\r\n    ```\r\n\r\n    No:\r\n\r\n    ```python\r\n    with conn:\r\n        do_stuff_in_transaction(conn)\r\n    ```\r\n    后一种用法没有为`__enter__`和`__exit__`提供任何信息，从而不知道何时要开始做什么或者何时要关闭连接。这里明确性很重要。\r\n- 要重视`return`语句。一个函数的返回语句要么返回一个表达式，要么什么也不返回。如果返回的是表达式，但没有值可以返回的时候，应该返回`None`；同时，比较明确的返回值应该放到函数的后面，增加可读性.\r\n\r\n    Yes:\r\n\r\n    ```python\r\n    def foo(x):\r\n        if x >= 0:\r\n            return math.sqrt(x)\r\n        else:\r\n            return None\r\n\r\n    def bar(x):\r\n        if x < 0:\r\n            return None\r\n        return math.sqrt(x)\r\n    ```\r\n\r\n    No:\r\n\r\n    ```python\r\n    def foo(x):\r\n        if x >= 0:\r\n            return math.sqrt(x)\r\n\r\n    def bar(x):\r\n        if x < 0:\r\n            return\r\n        return math.sqrt(x)\r\n    ```\r\n- 使用字符串的方法，而不是使用`string`模块。字符串方法一般更快，并且使用相同的API。\r\n- 尽量使用`''.startswith()`,`''.endswith()`\r\n\r\n    ```python\r\n    Yes: if foo.startswith('bar'):\r\n    No:  if foo[:3] == 'bar':\r\n    ```\r\n- 比较对象的类型，应该直接使用`isinstance()`\r\n\r\n    ```python\r\n    Yes: if isinstance(obj, int):\r\n    No:  if type(obj) is type(1):\r\n    ```\r\n\r\n    当检测一个对象是否是字符串，要记住这也可能是`unicode`字符串。在Python 2中，`str`和`unicode`有一个共同的基类`basestring`，因此可以这样:\r\n\r\n        ```python\r\n        if isinstance(obj, basestring):\r\n        ```\r\n\r\n    但要记住，在Python3中，`unicode`和`baseString`都不存在了，并且`bytes`对象不再属于字符串，而是看做整数序列。\r\n- 对于序列，包括字符串、列表、元组，空序列等同于`false`:\r\n\r\n    ```python\r\n    Yes: if not seq:\r\n         if seq:\r\n\r\n    No: if len(seq)\r\n        if not len(seq)\r\n    ```\r\n- 不要依赖于行尾的空白符，有些编辑器可能不显示后面的空白符，可以参看`reindent.py`\r\n- 不用用`==`比较布尔值:\r\n\r\n    ```python\r\n    Yes:   if greeting:\r\n    No:    if greeting == True:\r\n    Worse: if greeting is True:\r\n    ```\r\n"}}